首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >共享指针是否可以调用函数模板参数

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

Stack Overflow用户
提问于 2018-08-16 20:33:14
回答 1查看 188关注 0票数 3

This post回答了我最初的问题:如何在成员函数上创建模板?

答案是这样的:

代码语言:javascript
运行
复制
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;
}

我正在尝试用共享指针来完成同样的事情。我发现这不起作用:

代码语言:javascript
运行
复制
template <typename TOwner, void(TOwner::*func)()>
void Call(std::shared_ptr<TOwner> p) {
    (p->*func)();
}

然而,这是可行的。

代码语言:javascript
运行
复制
template <typename TOwner, void(TOwner::*func)()>
void Call(std::shared_ptr<TOwner> p) {
    (p.get()->*func)();
}

有没有更好的方法来实现这一点?

EN

回答 1

Stack Overflow用户

发布于 2018-08-16 20:44:53

让我试着解决“有没有更好的方法来实现这一点?”问题的一部分:如果你可以使用C++17,std::invoke可以很好地处理指向成员函数的指针和智能指针:

代码语言:javascript
运行
复制
#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函数模板,仍然可以接受任意成员函数指针。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51877196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档