我正在尝试编写一个将附加一些函数指针的类。
该指针将从此类的另一个方法中调用。我将函数指针存储在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 *转换为函数指针的正确方法吗?
在C ++ 98/03中,不允许直接将void *转换为函数指针(不应使用任何强制转换进行编译)。它在C ++ 0x中有条件地受支持(实现可以选择定义行为,并且如果确实定义了行为,则它必须执行标准规定的行为。void *,由C ++ 98/03定义标准,旨在指向对象,而不包含函数指针或成员指针。
再一次:
你不能
您可以将数据指针转换为void *,然后返回到与之相同的指针类型。std :: function不是指针类型,因此强制类型转换在静态上是无效的,并且与开始时的操作也不相同。您已经从类型为void()()的.target开始,但这不是数据指针,而是函数指针,因此将其强制转换为void并返回是实现定义的。
在您的特定情况下,您可以尝试执行以下操作:
class PointerToFunction {
};
template <typename Type>
class PointerToFunctionType : public PointerToFunction, std::function<Type> {
public:
using std::function<Type>::function; // I think this is the right syntax for this trick: https://softwareengineering.stackexchange.com/a/197901/342247
};
// Now, we can do this:
std::vector<PointerToType*> _CallbackVector;
基本上,我们使用的继承技巧与实现boost :: any / std :: any(自C ++ 17开始)的方式类似,将其存储std::function
在指针中。唯一的问题是知道如何将其转换回去。正确执行此操作将取决于您期望如何将其转换void*
回开始(即知道其类型),因此我将把这一部分留给您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句