c++ - 将字段名称传递到函数模板中

标签 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;
}

这很好用,但是在 MyFunction 中我指定了 .Field1,有没有一种方法可以将这个字段的名称传递到模板中,例如:

void TestFunction(){
    Type1 mt1;
    MyFunction(mt1, Field1);
}

很明显,我不是在这里模板化一个类型,而且我不知道它会被称为什么(除了明显的答案 - 愚蠢!)所以我什至正在努力寻找解决方案。

最佳答案

您不能传入纯名称,因为名称不是 C++ 元模型的一部分,但您可以将pointers-to-members 传递给您的函数:

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 .

关于c++ - 将字段名称传递到函数模板中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15314497/

相关文章:

c++ - 为 WinSocks 和 *nix 制作非阻塞套接字

C++ 为变量分配异常大的内存

templates - 如何在 Elasticsearch 中为所有 future 字段定义映射

c++ - Boost预处理器多个模板类生成

c++ - 如何调试即使在第 1 行有断点也会发生的崩溃?

c++ - 检查子对象的地址是否在包含对象的范围内是否合法

ruby-on-rails-3 - 在 Rails 模板的末尾显示一条消息

python - 将 Django 指向不同的模板目录

c++ - 了解 C++ 和 Qt?

c++ - 函数模板特化(以 int 值为模板)