对给定结构成员应用操作的泛型方法
Generic method to apply operation on the given struct member
我想实现一个泛型方法,该方法可以对结构成员应用确定的操作,并将该成员作为参数传递。类似这样的东西:
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
关键字的类型。
相关文章:
- 传递非泛型函数的最有效方法是什么?
- 对列表类中的泛型方法禁用编译器警告 2100,该泛型方法可能包含指针,也可能不包含指针
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- 如何将泛型方法传递给静态函数
- 使用泛型成员变量"placement new"结构/类数组的正确方法是什么?
- 这是为浮点数/双精度函数泛型的正确方法吗?
- 基于变量输入的泛型类方法计算
- 用于泛型类型上的泛型操作的SFINAE
- 有没有一种方法可以在c++中比较泛型类型(模板)和具体类型
- 推导函子返回类型的泛型方法
- 对给定结构成员应用操作的泛型方法
- 如何在参数为泛型类型的模板类中为方法类型化定义函数签名
- 使用基类的泛型方法指针调用派生类的方法
- 用返回子类的方法设计C++泛型类
- C++返回类型的泛型集合的正确方法
- 具有泛型类方法定义的长模板参数列表
- c++中的泛型方法
- 在Swift中定义显式泛型方法
- 将模板类的嵌套结构作为泛型方法的参数
- 如何构建一个泛型方法,将不同Q_PROPERTY类型的 notifySignal 从属性 char * 名称连接到空槽