会员功能,无法推断'自动'

时间:2015-01-25 12:47:02

标签: c++ function-pointers auto

我想知道在c ++中是否可以从对象的成员函数中获取纯函数指针。

class AS
{
    int x;
public:
    AS(int xx)
    {
        x = xx;
    }

    void ww(void* p)
    {
        std::cerr << "AS::ww " << x << std::endl;
    }
};

void exp()
{
    void* pp = 0;
    AS aa(9);
    ((aa).*(&AS::ww))(pp);//compiles and work fine
    auto ff = ((aa).*(&AS::ww));//not compiling
}

我试过保留调用部分:

    auto ff = ((aa).*(&AS::ww));

但是这给了我error: unable to deduce ‘auto’ from ‘aa.*&AS::ww’

那为什么呢?它没有类型?

你怎么称呼一个没有类型的人?

2 个答案:

答案 0 :(得分:4)

IIRC一些实现支持在对象中保留这样的闭包,但它不符合标准。 [expr.mptr.oper] / 6:

  

如果.*->*的结果是函数,则可以使用该结果   仅作为函数调用运算符()的操作数。

但是,从C ++ 11开始(由于您使用auto必须使用它),请使用std::bind或lambda:

auto ff = [&] (void* p) {return aa.ww(p);};

答案 1 :(得分:0)

这个特殊问题通常是由与C回调的接口引起的(`void *参数是赠品)。解决方案是要意识到在这些情况下,控制void *。

因此:

class AS
{
    int x;
public:
    AS(int xx)
    {
        x = xx;
    }
    void ww()
    {
        std::cerr << "AS::ww " << this << std::endl;
    }
    static void ww(void* p)
    {
        static_cast<AS*>(p)->ww();
    }
};
setupCcallback(&AS::ww, static_cast<void*>(&aa));