检测Callable是否为静态

时间:2014-10-04 03:29:12

标签: d

我以为我可以使用std.traits.functionAttributes执行此操作,但它不支持static。对于任何类型的可调用(包含opCall的结构),如何判断该可调用是否使用static进行注释?例如:

template isStaticCallable(alias fun) if (isCallable!fun)
{
    enum isStaticCallable = ...?
}

1 个答案:

答案 0 :(得分:4)

Traits是dlang的一部分,可以深入了解编译时信息。其中一个可用特征是isStaticFunction用作__traits(isStaticFunction, fun)

示例代码:

import std.traits;

template isStaticCallable(alias fun) if (isCallable!fun)
{
    enum isStaticCallable = __traits(isStaticFunction, fun);
}


void main() {}

class Foo
{
    static void boo() {}
    void zoo() {}
}

pragma(msg, isStaticCallable!main); // note that this prints true because
                                    // the function has no context pointer
pragma(msg, isStaticCallable!(Foo.boo)); // prints true
pragma(msg, isStaticCallable!(Foo.zoo)); // prints false