2013-03-09 14 views
7

Zastanawiam się, czy istnieje sposób, w jaki mógłbym przekazać nazwę pola do szablonu funkcji. Rozważmy następujący:Przekazywanie nazwy pola do szablonu funkcji

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; 
} 

Działa to dobrze, jednak w ciągu MyFunction jestem określające .Field1, czy istnieje sposób mogę przekazać nazwę tego pola do szablonu, na przykład:

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

Jasno Nie jestem tutaj szablonem i nie mam pojęcia, jak to się nazwie (poza oczywistą odpowiedzią - głupio!), Więc walczę nawet o znalezienie rozwiązania.

+1

Możesz zajrzeć do koncepcji wskaźnika do członka. –

+0

Niezwiązane z zadawanym pytaniem, ale '_Type' jest zarezerwowane dla implementacji, więc nie możesz go używać (to znaczy powoduje niezdefiniowane zachowanie). –

+0

@ n.m. Dziękuję, właśnie miałem odpowiedzieć Zacznę wyszukiwanie, dopóki odpowiedzi nie nadejdą! :) – R4D4

Odpowiedz

11

Nie można przejść w czystych nazw, ponieważ nazwy nie są częścią C++ meta-modelu, ale można przekazać wskazówki do członków do funkcji:

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 
} 

Oto jak można używać go w małej, kompletnego programu:

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); 
} 

A tutaj jest live example.

5

można przekazać pointer-to-member:

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

MyFunction(mt1, &Type1::Field1); 
Powiązane problemy