将字段名称传递给函数模板

时间:2013-03-09 18:42:56

标签: c++ templates

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

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的{​​{1}}中,有没有办法可以将此字段的名称传递给模板,例如:

.Field1

显然,我并没有在这里模仿一种类型,而且我不知道这会被称为什么(除了显而易见的答案 - 愚蠢!)所以我甚至都在努力寻找解决方案。< / p>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

您可以传递pointer-to-member

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

MyFunction(mt1, &Type1::Field1);