使用std::shared_ptr与指向成员函数的指针

5

使用 C 指针,我可以做到这样:

#include <iostream>
#include <memory>
class Foo {
     void bar(){
     std::cout<<"Hello from Foo::bar \n";
        }
   } 

void main(){
    Foo foo; 
    Foo* foo_ptr=&foo;
    std::shrared_ptr<Foo> foo_sptr(&foo);
    void (Foo::*bar_ptr)()=&Foo::bar;
    (foo.*bar_ptr)();
    (foo_ptr->*bar_ptr)();
    //(foo_sptr->*bar_ptr)(); // does not compile for me

如果我想使用smart_ptr代替C指针,我会遇到编译错误:

error: no operator "->*" matches these operands
        operand types are: std::shared_ptr<Foo> ->* void (Foo::*)()
(foo_sptr->*bar_ptr)();

有没有一种方法可以在不使用std :: shared_ptr :: get()的情况下使其工作?

2
在 C++ 中,对于函数指针,你应该使用 "std::function"。 - Tiago Gomes
1
使用 std::function 的在线演示:http://ideone.com/vKsvXA - Tiago Gomes
1
@πάνταῥεῖ OP并没有在那里存储一个,他们试图通过shared_ptr调用成员函数。 - Angew is no longer proud of SO
@Angew 是在创建 std::function 还是在调用时的开销? - MagunRa
@MagunRa 动态分配在创建 std::function 中。虚函数调用在其调用中。 - Angew is no longer proud of SO
显示剩余6条评论
2个回答

11

std::shared_ptr 没有提供重载的 operator ->*。所以你需要使用 get()

(foo_sptr.get()->*bar_ptr)();

实时示例


我知道get()函数并且它是有效的,但我一直在想它是否可以在不解开底层指针的情况下工作。 - MagunRa
这个答案告诉你答案是“不”。 - Lightness Races in Orbit
有点儿意思,Tiago Gomes的回答正好相反。但是我从Angew和Tiago那里得到了我想要的启示。 - MagunRa

0
(&*foo_sptr)->*bar_ptr()

看起来有点丑,但对于shared_ptr和raw指针都可以工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接