I believe that there are at least a couple of other open bugs on traits and delegates, so it would appear that traits are very broken for delegates right now.
Comment #2 by samukha — 2010-12-20T04:28:28Z
I am sure that using homonym templates for testing types and expressions is a bad idea. It results in some syntactic compression but at the same time brings lots of confusion. There should be two distinct templates. Something like this:
template isExpression(alias expression)
{
enum isExpression = is(typeof(expression));
}
template isDelegate(alias expression) if (isExpression!expression)
{
enum isDelegate = isDelegateType!(typeof(expression));
}
template isDelegateType(T)
{
static enum isDelegateType = is(T == delegate);
}
template isFunctionPointer(alias expression) if (isExpression!expression)
{
enum isFunctionPointer = isFunctionPointerType!(typeof(expression));
}
template isFunctionPointerType(T)
{
static if (__traits(compiles, *T.init))
enum isFunctionPointerType = isFunctionType!(typeof((*T.init)));
else
enum isFunctionPointerType = false;
}
template isFunctionType(T)
{
enum isFunctionType = is(T == function);
}
unittest
{
alias void delegate() Dg;
Dg dg;
alias void function() Fn;
Fn fn;
static void foo()
{
}
static assert(isDelegate!dg);
static assert(isDelegateType!Dg);
static assert(!__traits(compiles, isDelegate!Dg));
static assert(!isDelegateType!Fn);
static assert(isFunctionPointer!fn);
static assert(!__traits(compiles, isFunctionPointer!Fn));
static assert(!isFunctionType!Fn);
static assert(isFunctionPointerType!Fn);
static assert(!isFunctionPointerType!Dg);
static assert(isFunctionType!(typeof(*&foo)));
static assert(!isFunctionType!Fn);
static assert(!isFunctionType!Dg);
}
Comment #3 by samukha — 2010-12-20T06:02:00Z
"static enum" should be replaced with "enum" in the example
Comment #4 by andrej.mitrovich — 2013-02-24T16:24:20Z