8

我想知道是否有一种方法可以将字段名称传递给函数模板。考虑以下:

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

显然,我不是在这里模板类型,而且我不知道这将被称为什么(除了明显的答案 - 愚蠢!)所以我什至在努力寻找解决方案。

4

2 回答 2

13

您不能传入纯名称,因为名称不是 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);
}

这是一个活生生的例子

于 2013-03-09T18:47:00.023 回答
5

您可以传递一个指向成员的指针:

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

MyFunction(mt1, &Type1::Field1);
于 2013-03-09T18:46:45.437 回答