使用带有成员函数指针的std :: shared_ptr

时间:2014-02-06 12:42:52

标签: c++ pointers

使用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 个答案:

答案 0 :(得分:9)

std::shared_ptr未提供重载operator ->*。所以你必须使用get()

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

Live example

答案 1 :(得分:0)

(&*foo_sptr)->*bar_ptr()

看起来有点难看,但它适用于shared_ptr和原始指针。