2016-04-10 11 views
3

ich einen Typ geschaffen, die eine eindeutige Identität eines Verfahrens hältTyp-Inferenz für integrale Template-Parameter

template <typename Method, Method method> 
struct identity { 
}; 

Also ich Methoden in einer unverwechselbaren Art und Weise beschreiben können, auch wenn sie die gleiche Signatur haben

struct Class { 
    void foo() {} 
    void bar() {} 
}; 

typedef identity<decltype(&Class::foo), &Class::foo> foo_identity; 
typedef identity<decltype(&Class::bar), &Class::bar> bar_identity; 

std::cout << std::boolalpha << std::is_same<foo_identity, bar_identity>::value << std::end; 
// prints "false" 

#define GEN_IDENTITY(NAME) identity<decltype(&NAME), &NAME> 
GEN_IDENTITY(Class::foo) 
:

da das Verfahren der Instanziierung der Identität zu ausführlich ist, da beide Namen zweimal verwendet werden, kann es mit verkürzt werden

Aber gibt es eine Möglichkeit, es ohne die Verwendung eines Makros abzuleiten? Oder gibt es eine andere Möglichkeit, einen Typ zu erhalten, der eine Methode eindeutig beschreibt?

Antwort

4

Aber gibt es eine Möglichkeit, es ohne die Verwendung eines Makros abzuleiten?

Momentan keine. Es gibt einen Vorschlag, ein Konstrukt, in der Sprache für das Hinzufügen, die nicht Typ Template-Argument absetzbar machen wie auto (N4469)

Aber jetzt können Sie vereinfachen Identität mit diesem statt:

template<typename T, T t> 
using identity = std::integral_constant<T, t>; 
+0

Ok, danke für der Link zum Vorschlag Hoffentlich wird es irgendwann zum Standard hinzugefügt. – km216