成员函数,无法推断‘;自动’; 我想知道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 }

成员函数,无法推断‘;自动’; 我想知道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 },c++,function-pointers,auto,C++,Function Pointers,Auto,但这给了我错误:无法从'aa.*&AS::ww'推断'auto' 那为什么呢?它没有类型 如何称呼没有类型的人?IIRC一些实现支持在对象中保留此类闭包,但它不符合标准。[expr.mptr.oper]/6: 如果*或->*的结果是一个函数,则可以使用该结果 仅作为函数调用运算符的操作数() 但是,从C++11开始(由于使用的是auto),必须使用它),请使用std::bind或lambda: auto ff = [&] (void* p) {return aa.ww(p);}; II

但这给了我
错误:无法从'aa.*&AS::ww'推断'auto'

那为什么呢?它没有类型


如何称呼没有类型的人?

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

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

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

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

IIRC有些实现支持将此类闭包保存在对象中,但它不符合标准。[expr.mptr.oper]/6:

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

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

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

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

因此:

类作为
{
int x;
公众:
AS(int xx)
{
x=xx;
}
void ww()
{

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

因此:

类作为
{
int x;
公众:
AS(int xx)
{
x=xx;
}
void ww()
{

std::cerr成员函数很奇怪。唯一允许您使用
((aa)。*(&AS::ww))
的就是调用函数。好吧,没什么奇怪的。您需要提供调用函数的所有参数,
这个
实际上是这些参数之一。您不能只为函数调用提供两个参数中的一个,并且
((aa.*(&AS::ww))
缺少
void*p
参数。成员函数很奇怪。您唯一可以使用
((aa.*(&AS::ww))执行的操作
是用来调用函数的。没什么奇怪的。你需要提供调用函数的所有参数,
这个
实际上就是这些参数中的一个。你不能只为函数调用提供两个参数中的一个,
((aa)。*(&AS::ww))
缺少
void*p
参数。根据使用情况,
std::mem\u fn
可能是一个不错的选择。@T.C.询问者想要一个存储对象参数的函数对象,不是吗?@Columbo我想要一个纯函数指针
void(*)(void*p)独立于类和对象。因此,捕获lambda在这里并没有很大的改变,因为我仍然不能自由地传递它。我猜它在C++中是不可能的。但是,@ vLADP认为(a)每个这样的函数指针必须是唯一的,这样两个这样的函数指针会“知道”。使用不同的对象实例,这将需要生成运行时代码(并非在所有平台上都可以,如iOS)和(b)在某个时刻,用于生成函数指针的本机代码的内存需要释放——您能确定何时释放吗?@Vladp:C++11添加了一个从非捕获lambda到函数指针的隐式转换添加限制并不是为了让人恼火,而是因为它在许多合理的平台上都是必要的。根据使用情况,
std::mem\u fn
可能是一个不错的选择。@t.C.询问者想要一个存储对象参数的函数对象,不是吗?@Columbo我想要一个纯函数指针
void(*)(void*p)独立于类和对象。因此,捕获lambda在这里并没有很大的改变,因为我仍然不能自由地传递它。我猜它在C++中是不可能的。但是,@ vLADP认为(a)每个这样的函数指针必须是唯一的,这样两个这样的函数指针会“知道”。使用不同的对象实例,这将需要生成运行时代码(并非在所有平台上都可以,如iOS)和(b)在某个时刻,用于生成函数指针的本机代码的内存需要释放——您能确定何时释放吗?@Vladp:C++11添加了一个从非捕获lambda到函数指针的隐式转换添加限制并不是为了让人恼火,而是因为它在许多合理的平台上都是必要的。
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));