我想知道在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’
那为什么呢?它没有类型?
你怎么称呼一个没有类型的人?
答案 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));