2013-03-09 3 views
7

함수 템플릿에 필드 이름을 전달할 수있는 방법이 있는지 궁금합니다. 다음 사항을 고려 :필드 이름을 함수 템플릿에 전달

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

이 내가 .Field1를 지정하고 MyFunction 내 그러나, 잘 작동, 나는 템플릿에이 필드의 이름을 전달할 수있는 방법은 예를 들어,이 : 분명히

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

, 나는 여기에 타입을 템플릿으로 만들지 않을 것이고, 나는 이것을 (명백한 답을 제외하고 - 어리석은!) 무엇을해야 할지를 놓치고있다. 그래서 나는 심지어 해결책을 찾기 위해 고심하고있다.

+1

포인터 대 멤버 개념을 살펴볼 수 있습니다. –

+0

당신이 묻는 질문과는 관계가 없지만,'_Type'은 구현을 위해 예약되어 있으므로, 당신은 그것을 사용할 수 없습니다 (즉, 그렇게하지 않으면 정의되지 않은 동작을합니다). –

+0

@ n.m. 고맙습니다. 나는 막 대답하려고 할 때까지 검색을 시작할 것입니다! :) – R4D4

답변

11

이름이 C++ 메타 모델에 포함되지 않기 때문에 당신은 순수 이름에 통과 할 수 있지만, 포인터 - 투 - 회원을 전달할 수 있습니다 함수에 :

: 여기

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 
} 

는 작은, 전체 프로그램에서을 사용하는 방법입니다3210

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

여기는 live example입니다.

5

당신은 전달할 수있는 pointer-to-member :

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

MyFunction(mt1, &Type1::Field1); 
관련 문제