gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:32:12 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com