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

C++ pass pointer to member as template argument

本文关键字:参数传递 指针 成员 C++      更新时间:2023-10-16

我有一堆非常相似的函数:

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>;
...

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

#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);
相关文章: