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

R4D*_*4D4 7 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;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但在MyFunction我指定的范围内.Field1,有没有办法可以将此字段的名称传递给模板,例如:

void TestFunction(){
    Type1 mt1;
    MyFunction(mt1, Field1);
}
Run Code Online (Sandbox Code Playgroud)

很明显,我并没有在这里模仿一种类型,而且我对这会被称为什么感到茫然(除了显而易见的答案 - 愚蠢!)因此我甚至都在努力寻找解决方案.

And*_*owl 12

您不能传递纯名称,因为名称不是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
}
Run Code Online (Sandbox Code Playgroud)

以下是如何在一个小型,完整的程序中使用它:

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);
}
Run Code Online (Sandbox Code Playgroud)

这是一个实例.


Kon*_*lph 5

您可以传递指向成员指针:

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

MyFunction(mt1, &Type1::Field1);
Run Code Online (Sandbox Code Playgroud)