【发布时间】:2019-12-02 12:55:59
【问题描述】:
首先我要为这个测试上课:
struct Foo {
void test() {
std::cout << "test" << std::endl;
}
};
struct Bar {
Foo foo;
};
和一个模板类,它在构造时接受指向成员的指针:
template<typename Type, typename MemberType>
class test {
public:
test(Type &t, MemberType Type::* p) : t(t) {
(t.*p).test();
}
Type &t;
};
效果很好,可以使用test<Bar, Foo> test(bar, &Bar::foo);进行实例化,只是每次都写Bar和Foo很无聊,因为可以推导出&Bar::foo,所以我决定做一个专门化版本:
template<typename Type, typename MemberType, MemberType Type::*p>
class test<MemberType Type::*p> {
public:
test(Type &t) {
(t.*p).test();
}
};
好的,我真的不知道该怎么做,我只想传递一个 MemberType Type::*p 作为唯一的模板参数,如下所示:test<&Bar::foo> test(bar);
然后我创建一个全新的类:
template<typename Type, typename MemberType, MemberType Type::*p>
class test2 {
public:
test2(Type &t) {
(t.*p).test();
}
};
现在我可以作为模板参数而不是构造函数参数传递,但是这次我必须写三个参数:test2<Bar, Foo, &Bar::foo> test2(bar);
那么我可以简单地使用test<&Bar::foo> test(bar); 的正确方法是什么?
【问题讨论】:
标签: c++ templates pointer-to-member