2014-10-04 63 views
3

我认为我可以用std.traits.functionAttributes做到这一点,但它不支持static。对于任何类型的可调用(包含opCall的结构),如何判断该可调用是否注明了static?例如:检测Callable是否为静态

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

回答

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