我想知道是否有一种方法可以将字段名称传递给函数模板。请考虑以下事项:
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>
答案 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);