在给定结构成员上应用操作的通用方法

时间:2016-04-19 08:04:41

标签: 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

2 个答案:

答案 0 :(得分:3)

首先,对于您的错误,您需要指定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);

答案 1 :(得分:0)

我发现了这个问题。

SonarSensor(trigPinFront, echoPinFront);
FrontSensor = distance;
if(FrontSensor > 30) {
  FrontSensor = FrontSensor / 30;
  BTserial.write(FrontSensor);
Serial.println(FrontSensor);
}
delay(1000);

问题是我必须告诉编译器template<typename T> void gen_method(Type &t, typename PointerToTypeMember<T>::type member){ // ... } 是使用PointerToTypeMember<T>::type关键字的类型。