2016-04-19 8 views
1

Ich möchte eine generische Methode implementieren, die eine bestimmte Operation auf ein Strukturelement anwenden und dieses Element als Parameter übergeben kann. Etwas wie folgt aus:Generische Methode zum Anwenden der Operation für das angegebene Strukturelement

typedef struct Type_t{ 
    int a; 
    double b; 
} Type; 

void gen_method(Type &t, TypeMember m){ 
    t.m += 1; 
} 

Was ich bisher getan:

typedef struct Type_t{ 
    int a; 
    double b; 
} Type; 

typedef double Type::* PointerToTypeMemberDouble; 

void gen_method(Type &t, PointerToTypeMemberDouble member){ 
    t.*member += 1; 
} 

Was ich

Jetzt tun möchte Ich möchte die gleiche generische Methode implementieren, aber die Vorlagen ermöglichen Benutzer auf jedes Strukturelement zugreifen, unabhängig von seinem Typ. Dies ist, was ich getestet habe:

typedef struct Type_t{ 
    int a; 
    double b; 
} Type; 

template<typename T> 
struct PointerToTypeMember{ 
    typedef T Type::* type; 
}; 

template<typename T> 
void gen_method(Type &t, PointerToTypeMember<T>::type member){ 
    // ... 
} 

Der Fehler

Wenn ich zu kompilieren versuchen, erhalte ich diese Fehlerliste: error C2061: syntax error : identifier 'type'

Und diese Warnung: warning C4346: 'myNamesPace::Type<T>::type' : dependent name is not a type

Antwort

3

Zum einen für Ihre Fehler, müssen Sie typename angeben:

template<typename T> 
void gen_method(Type &t, typename PointerToTypeMember<T>::type member) { 

Siehe Where and why do I have to put the “template” and “typename” keywords?

Zweitens Sie die Hilfsklasse Vorlage nicht brauchen PointerToTypeMember überhaupt. Und weil nested-name-specifier couldn't be deduced in template argument deduction, müssen Sie das Template-Argument angeben, wenn verwenden Sie es als:

Type t{}; 
gen_method<int>(t, &Type::a); 
gen_method<double>(t, &Type::b); 

Sie direkt die Klasse Mitglied als Template-Parameter angeben könnte,

template<typename T> 
void gen_method(Type &t, T Type::*member){ 
    t.*member += 1; 
} 

und keine Notwendigkeit, die Template-Argument angeben , Template Argument Abzug wird es für Sie tun.

Type t{}; 
gen_method(t, &Type::a); 
gen_method(t, &Type::b); 
+2

Beachten Sie, dass Ihre Stichprobe erlaubt, Mitglied Typ abzuleiten, während OP den Mitgliedstyp in 'gen_method' Anruf angeben muss. – Jarod42

0

I habe das Problem gefunden.

template<typename T> 
void gen_method(Type &t, typename PointerToTypeMember<T>::type member){ 
    // ... 
} 

Das Problem war, dass ich den Compiler zu sagen haben, die PointerToTypeMember<T>::type eine Art der typename Schlüsselwort ist.

Verwandte Themen