2013-03-09 19 views
7

Ich frage mich, ob es einen Weg gibt, wie ich einen Feldnamen an eine Funktionsvorlage übergeben könnte. Betrachten Sie das folgende:Übergabe des Feldnamens an eine Funktionsvorlage

struct Type1{ 
    unsigned int Field1; 
    unsigned int Field2; 
}; 

struct Type2{ 
    unsigned int Field2; 
    unsigned int Field3; 
}; 

template <typename TYPE> 
bool MyFunction(TYPE _Type){ 
    if(_Type.Field1==5) 
     return false; 
} 

Dies funktioniert gut, aber innerhalb MyFunction ich .Field1 bin Angabe, ist es eine Möglichkeit, den Namen dieses Feldes in eine Vorlage passieren kann, zum Beispiel:

void TestFunction(){ 
    Type1 mt1; 
    MyFunction(mt1, Field1); 
} 

Klar Ich schreibe hier keinen Typ, und ich weiß nicht, wie das heißen soll (abgesehen von der offensichtlichen Antwort - albern!), Also habe ich Mühe, nach einer Lösung zu suchen.

+1

Vielleicht möchten Sie in das Zeiger-zu-Element-Konzept schauen. –

+0

Nicht verwandt mit der Frage, die Sie stellen möchten, aber "_Type" ist für die Implementierung reserviert, Sie dürfen sie also nicht verwenden (d. H., Dies führt zu undefiniertem Verhalten). –

+0

@ n.m. Danke, ich wollte gerade antworten Ich werde anfangen zu suchen, bis die Antworten hereinkamen! :) – R4D4

Antwort

11

Sie können nicht in reiner Namen passieren, weil Namen nicht Teil des Meta-Modells C++ sind, aber Sie können Zeiger-to-Mitglieder übergeben auf Ihre Funktion:

template <typename TYPE, typename T> 
bool MyFunction(TYPE obj, T TYPE::*mp) 
//       ^^^^^^^^^ 
{ 
    if ((obj.*mp) == 5) 
//   ^^^^ 
     return false; 

    // ... <== DON'T FORGET TO RETURN SOMETHING IN THIS CASE, 
    //   OTHERWISE YOU WILL GET UNDEFINED BEHAVIOR 
} 

Hier ist, wie man es in einem kleinen, kompletten Programm verwenden würde:

struct Type1{ 
    unsigned int Field1; 
    unsigned int Field2; 
}; 

struct Type2{ 
    unsigned int Field2; 
    unsigned int Field3; 
}; 

int main() 
{ 
    Type1 t1; 
    Type2 t2; 
    MyFunction(t1, &Type1::Field1); 
    MyFunction(t2, &Type2::Field3); 
} 

Und hier ist ein live example.

5

können Sie übergeben ein pointer-to-member:

template <typename T> 
bool MyFunction(T& type, int T::*field){ 
    if (type.*field == 5) 
     return false; 
} 

MyFunction(mt1, &Type1::Field1); 
Verwandte Themen