繁体   English   中英

共享指针可以调用函数模板参数

[英]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.

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