2014-10-04 50 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