gpt4 book ai didi

c++ - 共享指针可以调用函数模板参数吗

转载 作者:太空狗 更新时间:2023-10-29 21:11:03 25 4
gpt4 key购买 nike

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)();
}

有没有更好的方法来完成这个?

最佳答案

让我尝试解决“是否有更好的方法来完成此任务?”问题的一部分:如果可以使用 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 函数模板,仍然接受任意成员函数指针。

关于c++ - 共享指针可以调用函数模板参数吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51877196/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com