[英]Can a shared pointer call a function template argument
这篇文章回答了我原来的问题:如何在成员函数上模板?
答案有代码:
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)();
}
有没有更好的方法来实现这一目标?
让我试着解决“有没有更好的方法来实现这一目标?” 部分问题:如果你可以使用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
函数模板,仍然接受任意成员函数指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.