对给定结构成员应用操作的泛型方法

Generic method to apply operation on the given struct member

本文关键字:操作 泛型方法 应用 成员 结构      更新时间:2023-10-16

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

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) {

请参阅我必须在哪里以及为什么要放置"template"answers"typename"关键字?

其次,您根本不需要helper类模板PointerToTypeMember。由于嵌套的名称说明符无法在模板参数推导中推导出来,因此在使用时必须指定模板参数:

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

我发现了问题。

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

问题是我必须告诉编译器PointerToTypeMember<T>::type是一个使用typename关键字的类型。