This post回答了我最初的问题:如何在成员函数上创建模板?
答案是这样的:
struct Foo {
void Bar() { // do something
}
};
template <typename TOwner, void(TOwner::*func)()>
void Call(TOwner *p) {
(p->*func)();
}
int main() {
Foo a;
Call<Foo, &Foo::Bar>(&a);
return 0;
}我正在尝试用共享指针来完成同样的事情。我发现这不起作用:
template <typename TOwner, void(TOwner::*func)()>
void Call(std::shared_ptr<TOwner> p) {
(p->*func)();
}然而,这是可行的。
template <typename TOwner, void(TOwner::*func)()>
void Call(std::shared_ptr<TOwner> p) {
(p.get()->*func)();
}有没有更好的方法来实现这一点?
发布于 2018-08-16 20:44:53
让我试着解决“有没有更好的方法来实现这一点?”问题的一部分:如果你可以使用C++17,std::invoke可以很好地处理指向成员函数的指针和智能指针:
#include <memory>
#include <functional>
auto a = std::make_shared<Foo>();
std::invoke(&Foo::Bar, a); // Ok: pass the shared_ptr itself
std::invoke(&Foo::Bar, *a); // Also ok: pass a reference to the pointee在这种情况下,std::invoke可以替换Call函数模板,仍然可以接受任意成员函数指针。
https://stackoverflow.com/questions/51877196
复制相似问题