C++ 将字段名传递到函数模板中
我想知道是否有一种方法可以将字段名传递给函数模板。考虑以下事项:C++ 将字段名传递到函数模板中,c++,templates,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==
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;
}
显然,我并没有在这里模板化一个类型,我不知道这会被称为什么(除了显而易见的答案-愚蠢!),所以我甚至在努力寻找解决方案。你可以通过一个:
模板
bool MyFunction(T&type,int T::*字段){
if(type.*字段==5)
返回false;
}
MyFunction(mt1和Type1::Field1);
<代码> > p>不能以纯名称传递,因为名称不是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
}
这是一个。您可能想查看指向成员概念的指针。与您要问的问题无关,但是\u Type
是为实现保留的,因此不允许您使用它(即,这样做会产生未定义的行为)@n.m.谢谢你,我正要回复,我会开始搜索,直到答案滚滚而来!:)@R4D4下划线后跟大写字母。只要不在全局名称空间中,一个下划线后跟一个小写字母就可以了。嗯,这很复杂只是不要使用前导下划线。部分-下划线后跟大写字母总是保留的。下划线后跟其他内容将保留在全局名称空间中,但在这里是允许的(尽管我通常不建议这样做)。
template <typename T>
bool MyFunction(T& type, int T::*field){
if (type.*field == 5)
return false;
}
MyFunction(mt1, &Type1::Field1);
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);
}