将 C 函数指针分配给成员函数
Assigning C-function pointer to a member function
已编辑
我想将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
但我得到了一个汇编
错误。。\swctext.cpp|25|error: 无法在赋值中将"void (swc::swcText::*)()"转换为"void (*)()"|
我知道我可以使用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++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针