C ++将指向成员的指针作为模板参数传递

时间:2019-12-13 15:38:36

标签: c++ templates

我有一堆非常相似的功能:

void foo1(Obj o) {
    bar(o.a);
}

void foo2(Obj2 o) {
    bar(o.b);
}

void foo3(Obj3 o) {
    bar(o.c);
}

如何减少代码重复?我可以做类似的事情吗?

template<typename T, pointerToMember>
void foo(T o) {
    bar(o.pointerToMember);
}

然后创建所有功能,例如:

foo<Obj, Obj.x>;
...

1 个答案:

答案 0 :(得分:2)

是的,可以有一个指向成员的指针作为模板参数:

#include <string>

struct Obj {
    int a,b,c;
};

void bar(int x){}

template<typename T, int (T::*pointerToMember)>
void foo(T o) {
    bar(o.*pointerToMember);
}
int main() {
    Obj x;
    foo<Obj,&Obj::a>(x);
}

但是,有多种方法可以使通话变得不太冗长。您可以将成员指针作为参数进行传递,以推断出该指针,从而可以将其称为

foo(x,&Obj::a);

最后一点,您可以直接致电bar

bar(x.a);