我有一堆非常相似的功能:
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>;
...
?
答案 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);