On Friday, 12 September 2014 at 19:44:28 UTC, MrSmith wrote:
Given the following program:
---------------------------------
import std.stdio;
template first(string s)
{
string first(string par)
{
if (par == s)
return "true";
else
return "false";
}
}
template second(alias firstInstance)
{
string second(string par)
{
// this line doesn't work
static if (is(firstInstance : F!(str), alias F, string str))
`is(...)` checks for types. firstInstance isn't a type, it's a
function, so the `is` expression is always false. You can use
std.traits.TemplateArgsOf instead:
import std.traits;
import std.typetuple;
static if(__traits(compiles,
TemplateArgsOf!firstInstance))
{
alias targs = TemplateArgsOf!firstInstance;
static if(is(typeof(targs) ==
TypeTuple!string))
writeln("matched ", targs[0]);
}
{
writeln("matched ", str);
}
enum s = "XXX"; // get s from firstInstance
// without parsing strings and using mixins
// something like second(alias C : F!(str), alias F, string
str)
You're on the right track:
template second(alias C : F!(str), alias F, string str)
{
string second(string par)
{
import std.string : icmp;
if (icmp(par, str) == 0)
return "true";
else
return "false";
}
}
import std.string : icmp;
if (icmp(par, s) == 0)
return "true";
else
return "false";
}
}
void main()
{
writeln(first!"str"("str"));
writeln(second!( first!"str" )("StR")); // should match string
from first, but case insensetive
}
---------------------------------
How do I extract s parameter of first passed to second via
alias parameter. It seems like it is not possible. Or is it?