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

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

最佳答案

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

#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);

关于c++ - C++将指向成员的指针作为模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59325655/

相关文章:

c++ - 从模板类赋值运算符访问私有(private)成员变量

c++ - 尝试在 cpp 中打印 n 维数组

c++ - 使用C++模板编程提取任意结构的字段类型

c++ - 霍夫曼以位存储代码

c++ - 具有重复的枚举器值

c++ - 我可以使用std::array的自定义分配器来获得安全的加密 key 吗?

c++ - 通过 unix 信号优雅地终止 Qt 应用程序

c++ - 由于对模板化类型的通用(前向)引用而无法实例化函数模板

c++ - 为什么在预期 T 或 T& 时定义重载运算符的任意返回类型是合法的

c++ - 调用与方法同名的函数