我想知道是否有一种方法可以将字段名称传递给函数模板.考虑以下:
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)
这是一个实例.
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)