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