2013-03-09 40 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; 
} 

這工作得很好,但是內MyFunction我指定.Field1,是有辦法,我可以通過這個字段的名稱爲模板,例如:

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

顯然,我不是在這裏模擬一個類型,我對這個被稱爲的東西感到不知所措(除了顯而易見的答案 - 傻!),所以我甚至努力尋找解決方案。

+1

你可能想看看指向成員的概念。 – 2013-03-09 18:46:21

+0

與你所問的問題無關,但'_Type'是爲實現保留的,所以你不允許使用它(即這樣做會導致未定義的行爲)。 – 2013-03-09 18:46:53

+0

@ n.m。謝謝我剛要回復,我會開始尋找,直到答案滾滾而來! :) – R4D4 2013-03-09 18:47:55

回答

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 
} 

這裏是你將如何使用它在一個小的,完整的程序:

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); 
相關問題