【发布时间】:2019-08-09 18:35:30
【问题描述】:
我正在尝试编写一个将附加一些函数指针的类。
这个指针会被这个类的另一个方法调用。我将把函数指针存储在一个 void* 向量上,这样任何东西都可以放在一个向量上,而不是每种类型的不同向量。
我打算为我需要从类内部调用的任何不同函数声明不同的 AppendCallback 方法,例如:
void MyClass:AppendCallback(void (*Callback)())
{
_CallbackVector.push_back((void*)Callback);
_IdVector.push_back(VoidID);
}
void MyClass:AppendCallback(void (*Callback)(uint32_t));
void MyClass:AppendCallback(void (*MyOtherClass::Callback)());
void MyClass:AppendCallback(void (*MyOtherClass::Callback)(uint32_t));
将有第二个向量,它只包含标识符以知道 void* 指向什么,这也将在 AppendCallback 方法上分配。
如何将 void 指针再次转换为调用这些函数的函数指针?
也许是这样的?
void MyClass::Service(uint32_t x)
{
for(uint i = 0; i < _CallbackVector.size(); i++)
{
switch(_IdVector[i])
{
case VoidID: void(*_CallbackVector[i]()); break;
case Uint32ID: void(*_CallbackVector[i](x)); break;
}
}
}
编辑:
这是从 void* 转换为函数指针的正确方法吗?
【问题讨论】:
-
是的,您必须自己存储某种类型信息。
-
iirc,在 C++ 中,没有规定将函数指针存储到
void*中,也没有规定将void*转换回函数指针。它可能适用于您的平台,但我认为它是 UB。您可能想在这个问题中添加language-lawyer。 -
这并没有解决问题,但以下划线开头的名称后跟大写字母(
_CallbackVector、_IdVector)和包含两个连续下划线的名称保留供执行。不要在你的代码中使用它们。 -
void*不需要足够大以容纳函数指针。阅读std::function。
标签: c++ methods casting language-lawyer