成员函数,无法推导出“auto”
Member function, unable to deduce ‘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’
那是为什么呢?它没有类型?
没有类型的人怎么称呼?
IIRC 一些实现支持在对象中保留此类闭包,但它不符合标准。 [expr.mptr.oper]/6:
If the result of .*
or ->*
is a function, then that result can be used
only as the operand for the function call operator ()
.
但是,从 C++11 开始(您必须使用它,因为您正在使用 auto
),请使用 std::bind
或 lambda:
auto ff = [&] (void* p) {return aa.ww(p);};
这个特殊问题通常是由与 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));
我想知道在 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’
那是为什么呢?它没有类型?
没有类型的人怎么称呼?
IIRC 一些实现支持在对象中保留此类闭包,但它不符合标准。 [expr.mptr.oper]/6:
If the result of
.*
or->*
is a function, then that result can be used only as the operand for the function call operator()
.
但是,从 C++11 开始(您必须使用它,因为您正在使用 auto
),请使用 std::bind
或 lambda:
auto ff = [&] (void* p) {return aa.ww(p);};
这个特殊问题通常是由与 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));