2014-10-04 2 views
3

Я думал, что смогу сделать это с помощью std.traits.functionAttributes, но он не поддерживает static. Для любого типа вызываемых (structs с включенным opCall), как я могу определить, аннулирован ли этот вызываемый код с помощью static? Например:Обнаружение, если вызываемый является статическим

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 
Смежные вопросы