gpt4 book ai didi

c++ - 将 C 函数指针分配给成员函数

转载 作者:行者123 更新时间:2023-11-30 02:49:46 25 4
gpt4 key购买 nike

已编辑

我想绑定(bind) class X 的 C 函数指针到 class Y 的另一个成员函数.

他们的实现看起来像这样

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

friend class swc::swcText;
};

//The class w/c I want to assign/bind the XString::eventOnChange;
class swcText
{
public:

swcText()
{
//how can I do this
text.eventOnChange = &swcText::computeTextSize;
}
...

XString text;
private:

void computeTextSize();
};

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

error ..\swctext.cpp|25|error: cannot convert 'void (swc::swcText::*)()' to 'void (*)()' in assignment|

我知道我可以使用 std::function<void()> eventOnChange 来做到这一点并分配一个 lambda 函数,但如何在 C 风格的函数指针中执行此操作?

最佳答案

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

std:function<void()> f;
f = std::bind(&Y::computeTextSize, this);

如果您坚持不想使用类似的东西,您可以构建类似于 std::function<void()> 的函数和 std::bind()这是极其有限的:

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);

但是请注意,std::function<...>std::bind()往往会拉出相当多的额外技巧并且可以更有效地使用,尤其是在将带有内联调用运算符的函数对象传递给它们时(除了很多更灵活之外)。

关于c++ - 将 C 函数指针分配给成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20930130/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com