c++ - 对给定结构成员应用操作的通用方法

标签 c++ templates generics struct

我想实现一个通用方法,该方法可以对结构成员应用确定的操作,并将该成员作为参数传递。像这样:

typedef struct Type_t{
    int a;
    double b;
} Type;

void gen_method(Type &t, TypeMember m){
    t.m += 1;
}

到目前为止我做了什么:

typedef struct Type_t{
    int a;
    double b;
} Type;

typedef double Type::* PointerToTypeMemberDouble;

void gen_method(Type &t, PointerToTypeMemberDouble member){
    t.*member += 1;
}

我想做什么

现在我想实现相同的通用方法,但使用模板允许用户访问任何结构成员,而不管其类型如何。这是我测试过的:

typedef struct Type_t{
    int a;
    double b;
} Type;

template<typename T>
struct PointerToTypeMember{
    typedef T Type::* type;
};

template<typename T>
void gen_method(Type &t, PointerToTypeMember<T>::type member){
    // ...
}

错误

当我尝试编译时,我得到了这个错误列表: error C2061: syntax error : identifier 'type'

还有这个警告: warning C4346: 'myNamesPace::Type<T>::type' : dependent name is not a type

最佳答案

首先,对于你的错误,你需要指定typename:

template<typename T>
void gen_method(Type &t, typename PointerToTypeMember<T>::type member) {

参见 Where and why do I have to put the “template” and “typename” keywords?

其次,您根本不需要辅助类模板PointerToTypeMember。因为nested-name-specifier couldn't be deduced in template argument deduction ,使用时必须指定模板参数:

Type t{};
gen_method<int>(t, &Type::a);
gen_method<double>(t, &Type::b);

可以直接将类成员指定为模板参数,

template<typename T>
void gen_method(Type &t, T Type::*member){
    t.*member += 1;
}

无需指定模板参数,模板参数推导将为您完成。

Type t{};
gen_method(t, &Type::a);
gen_method(t, &Type::b);

关于c++ - 对给定结构成员应用操作的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36712233/

相关文章:

c# - 根据以下标准开发桌面应用程序的语言/平台

django - 如何将数据传递给 Django 中的模板?

asp.net-mvc-3 - 可重用的编辑器模板,带有用于业务对象的 DropDownList

c# - 方法 <ClassName> 是什么意思?

swift - 扩展泛型 Array<T> 以采用协议(protocol)

c++ - 在这种情况下是否可以避免使用虚拟方法调用?

c++ - 使用 constexpr 函数的返回值作为另一个函数的参数

c++ - 具有 extern #define 和 typedef 结构的静态库

c++ - ...使用时没有模板参数错误

java - 如何向这个通用列表添加元素?