如何将void指针强制转换为函数指针

车奇罗莫

我正在尝试编写一个将附加一些函数指针的类。

该指针将从此类的另一个方法中调用。我将函数指针存储在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 *转换为函数指针的正确方法吗?

Chipster

这在C ++中是不允许的

在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

函数指针将参数强制转换为 void

来自分类Dev

如何将类型为void(*)()的指针转换为void *

来自分类Dev

如何将void指针转换为int指针,然后将int指针存储在其中?

来自分类Dev

如何将整数转换为常量void指针?

来自分类Dev

如何将 void 指针转换为要在 C 中的函数中使用的浮点数?

来自分类Dev

如何将 void 指针转换为 rust 中具有任意签名的函数

来自分类Dev

您可以将“函数指针指向指针”转换为void *

来自分类Dev

函数指针被强制转换为void而不被调用

来自分类Dev

将指针转换为void

来自分类Dev

在强制转换为void *之后返回时如何删除指针

来自分类Dev

双指针的地址强制转换为void **

来自分类Dev

如何将指针转换为未命名的结构指针?

来自分类Dev

如何将char指针转换为int指针

来自分类Dev

将函数转换为通用 void 指针作为函数参数

来自分类Dev

为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

来自分类Dev

void *函数指针数组强制转换

来自分类Dev

如何在C ++ 17中将强制转换函数指针静态转换为noexcept?

来自分类Dev

如何合法地将函数指针转换为方法指针?

来自分类Dev

是否将LONG强制转换为函数指针?

来自分类Dev

在C语言中,将指针强制转换为struct ao void *的指针有什么用?

来自分类Dev

如何将ctypes指针强制转换为Python类的实例

来自分类Dev

如何将python列表转换为C中void类型的指针

来自分类Dev

将返回对象指针的函数强制转换为返回空指针的函数合法吗?

来自分类Dev

如何将模板类中的模板函数转换为函数指针

来自分类Dev

如何两次将指针转换为“ void *”无效?

来自分类Dev

如何将 void 指针传递给 C 中的函数?

来自分类Dev

将false转换为指针类型void *?

来自分类Dev

将 void 指针转换为动态类型

来自分类Dev

如何将“指针转换为指针类型”转换为const?

Related 相关文章

  1. 1

    函数指针将参数强制转换为 void

  2. 2

    如何将类型为void(*)()的指针转换为void *

  3. 3

    如何将void指针转换为int指针,然后将int指针存储在其中?

  4. 4

    如何将整数转换为常量void指针?

  5. 5

    如何将 void 指针转换为要在 C 中的函数中使用的浮点数?

  6. 6

    如何将 void 指针转换为 rust 中具有任意签名的函数

  7. 7

    您可以将“函数指针指向指针”转换为void *

  8. 8

    函数指针被强制转换为void而不被调用

  9. 9

    将指针转换为void

  10. 10

    在强制转换为void *之后返回时如何删除指针

  11. 11

    双指针的地址强制转换为void **

  12. 12

    如何将指针转换为未命名的结构指针?

  13. 13

    如何将char指针转换为int指针

  14. 14

    将函数转换为通用 void 指针作为函数参数

  15. 15

    为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

  16. 16

    void *函数指针数组强制转换

  17. 17

    如何在C ++ 17中将强制转换函数指针静态转换为noexcept?

  18. 18

    如何合法地将函数指针转换为方法指针?

  19. 19

    是否将LONG强制转换为函数指针?

  20. 20

    在C语言中,将指针强制转换为struct ao void *的指针有什么用?

  21. 21

    如何将ctypes指针强制转换为Python类的实例

  22. 22

    如何将python列表转换为C中void类型的指针

  23. 23

    将返回对象指针的函数强制转换为返回空指针的函数合法吗?

  24. 24

    如何将模板类中的模板函数转换为函数指针

  25. 25

    如何两次将指针转换为“ void *”无效?

  26. 26

    如何将 void 指针传递给 C 中的函数?

  27. 27

    将false转换为指针类型void *?

  28. 28

    将 void 指针转换为动态类型

  29. 29

    如何将“指针转换为指针类型”转换为const?

热门标签

归档