C++ 将C函数指针指定给成员函数 已编辑

C++ 将C函数指针指定给成员函数 已编辑,c++,function-pointers,C++,Function Pointers,我想将类X的C函数指针绑定到类Y的另一个成员函数 它们的实现如下所示 //The class w/c has the C-function pointer class XString { public: ... private: void (*eventOnChange)(); friend class swc::swcText; }; 我想实现text.evenOnChange=this->computeTextSize,但我得到了一个编译 error ..\sw

我想将
类X
的C函数指针绑定到
类Y
的另一个成员函数

它们的实现如下所示

//The class w/c has the C-function pointer
class XString
{
public:
    ...
private:
    void (*eventOnChange)();

    friend class swc::swcText;
};

我想实现
text.evenOnChange=this->computeTextSize
,但我得到了一个编译

error ..\swctext.cpp|25|error: cannot convert 'void (swc::swcText::*)()' to 'void (*)()' in assignment| 错误..\swctext.cpp | 25 |错误:无法将赋值中的“void(swc::swctext::*)()”转换为“void(*)()”|
我知道我可以使用
std::function eventOnChange
和分配lambda函数来实现这一点,但是如何在C风格的函数指针中实现这一点呢?

当调用非
静态
成员函数时,总是将对对象的引用传递到函数中,即
this
指向的实体。声明为
void(*)(
的函数不接受任何参数,因此与成员函数指针不兼容:无法分配它们。您需要以某种方式获得附加对象。当然,最简单的方法是只使用
std::function
std::bind()
将函数绑定到对象(无需使用lambdas):

您可以使用上述函数,如

text.eventOnChange = bind<swcText, &swcText::computeTextSize>(this);
text.eventOnChange=bind(此);

但是,请注意,
std::function
std::bind()
往往会带来很多额外的技巧,并且可以更有效地使用,特别是在将带有内联调用运算符的函数对象传递给它们时(除了更加灵活)。

std::bind
并没有按照您的想法做。。。它不会将一个函数绑定到赋值意义上的另一个函数,但它返回一个新函数,该函数模仿第一个参数(原始函数),带有一些固定参数,但可能有一些“缺失”参数(类似于部分固定参数);它不会修改任何内容。我建议阅读文档中的for std::bind,看看它是否返回成功/失败值(我怀疑它会返回)。此外,swcText::computeTextSize不是一个不接受返回void的参数的函数,因为它接受一个参数(隐式参数)。也许你想要一个带swcText参数的自由函数?@pepper_chico如果这篇文章对你来说是troll,我很抱歉,但我不明白你的意思。@mr5无所谓,它只是看起来像是一场关于
bind
和“binding functions”的文字游戏,就像C#委托一样<代码> STD::Boo< < C++ >绑定参数,仅此而已。您还可以查看增压信号2。
std:function<void()> f;
f = std::bind(&Y::computeTextSize, this);
class function
{
    void* object;
    void (*fun)(void*);
public:
    function(): object(), fun() {}
    function(void* o, void(*f)(void*)): object(o), fun(f) {}
    void operator()() const { if (object) (this->fun)(object); }
};

template <typename T, void (T::*member)()>
void call(void* object) {
    (static_cast<T*>(object)->*member)();
}
template <typename T, void (T::*member)()>
function bind(T* object) {
    return function(object, &call<T, member>);
}
text.eventOnChange = bind<swcText, &swcText::computeTextSize>(this);