On Tuesday, 12 August 2014 at 05:23:53 UTC, Dicebot wrote:
On Monday, 11 August 2014 at 13:00:27 UTC, John Colvin wrote:
   alias Parent = TypeTuple!(__traits(parent, foo!float))[0];

Say hello to optional parens - you are trying to call foo!float() here and apply result to trait.

I thought so. Ugh.

This works though:


void foo(float v){}
void foo(int a){}

alias Parent = TypeTuple!(__traits(parent, foo))[0];

pragma(msg, __traits(getOverloads, Parent, "foo"));


so it seems that instantiated function templates in this case are called parenthesis-free, whereas normal functions are passed by name/alias/whatever.

All expressions that are used as compile-time args (whether in udas, traits or as template arguments) should require parenthesis to be called. Anything else is madness.

A!(foo1().foo2()) //pass result
A!(foo1.foo2())   //pass result
A!(foo1.foo2)     //pass function
A!(foo1)          //pass function
foo(foo1)         //pass result

Reply via email to