Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字段名传递到函数模板中_C++_Templates - Fatal编程技术网

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);
}