简体   繁体   English

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

[英]C++ pass pointer to member as template argument

I have a bunch of very similar functions:我有一堆非常相似的功能:

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

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

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

How can I reduce the duplicating of code?如何减少代码重复? Can I do something like:我可以做这样的事情:

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

And then create all functions like:然后创建所有函数,如:

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

? ?

Yes it is possible to have a pointer to member as template parameter:是的,可以有一个指向成员的指针作为模板参数:

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

However, there are different ways that would make the call less verbose.但是,有不同的方法可以使调用不那么冗长。 You could pass the member pointer as parameter to be able to deduce it, that would allow to call it as您可以将成员指针作为参数传递以推断它,这将允许将其称为

foo(x,&Obj::a);

Last not least, you could call bar directly最后同样重要的是,您可以直接调用bar

bar(x.a);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM