gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:45 25 4
gpt4 key购买 nike

我想编写一个函数,将进程应用于类的成员。以下代码有效:

class AA
{
public:
AA(){};
~AA(){};
std::string type="AA";
};

class BB
{
public:
BB(){};
~BB(){};
template <typename T, typename TT>
void test(T& a, TT(T::*memberPtr))
{
std::cout<<"test: "<<(a.*memberPtr)<<std::endl;
}
std::string type="BB";
};

int main()
{
AA a;
BB b;
b.test(a, &AA::type);
}

但是我知道编译时的一切所以我想知道是否有可能写一些等效的东西但只用模板?所以我可以这样写:

b.test<&AA::type>(a);

在测试中调用(a):

std::cout<<"test: "<< (a.*MEMBER) <<std::endl; // MEMBER is given in template

或类似的东西。

最佳答案

你不能只做 test<&AA::type> ,因为您还需要告诉函数模板您期望的指向成员的指针的类型。典型的模式是:

template <class M, M member, class T> // deduced go last
void test(T& a) {
cout << (a.*member);
}

使用方法:

test<decltype(&AA::type), &AA::type>

我相信目前有一个减少冗长的建议,但在那之前,这还不是世界上最糟糕的事情,你总是可以:

#define TYPE_AND_VAL(foo) decltype(foo), foo
test<TYPE_AND_VAL(&AA::type)>

我提到的那个提议是在 C++17 中,并且允许你做:

template <auto member, class T>
void test(T& a) {
cout << (a.*member);
}

test<&AA::type>(a);

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com