我想存储函数的void指针及其类型

时间:2011-09-22 21:43:36

标签: c++ function casting void-pointers

我正在尝试创建一个向量保持指向函数的void指针,稍后将被称为secuentially 所以,让我说我有三个功能。 int a()void b();bool c();

我的矢量是vector<void *> vec;

我的函数存储指向函数的指针。

void registerFunction(void *func)
{
    vec.push_back(func);
}

现在我的问题是在尝试调用存储的所有函数时,因为它们都是无效指针,我只是在不知道它们的类型的情况下无法调用函数。

所以我的问题是......有没有办法存储符号类型,所以我可以将它们与各自的指针相关联,然后在调用函数的void指针时进行类型转换?

注意:函数不一定是类型,例如void (*)(),我也想添加方法,因此即。 void (someclass::)()。它要求太多了吗?它应该有用吗?

3 个答案:

答案 0 :(得分:4)

您无法将函数指针转换为void*。这是不允许的。

如果所有函数都可以使用零参数调用,并且您不关心返回类型,则可以使用std::vector<std::function<void()>>(如果您的C ++标准,也可以在Boost和TR1中找到function图书馆不支持它。)

但是,如果我没记错的话,在C ++ 11 std::function实现中不允许返回类型转换,在这种情况下,您可能需要以下内容:

template <typename T>
struct ignore_result_impl
{
    ignore_result_impl(T fp) : fp_(fp) { }
    void operator()() { fp_(); }
    T fp_;
};

template <typename T>
ignore_result_impl<T> ignore_result(T fp)
{
    return ignore_result_impl<T>(fp);
}

int g() { return 42; }
std::function<void()> f(ignore_result(g));

(在Boost实现中我知道你可以直接使用function<void()>,但我很确定在C ++ 11中不再允许这样做。我可能错了,我很感激评论中的澄清,如果有人知道的话。)

答案 1 :(得分:0)

只要所有函数都遵循相同的类型签名,就可以将void指针强制转换回该类型。

更好的解决方案是键入dede函数类型:

typedef int(*fun_ptr)();
vector<fun_ptr> vec;

然后你不需要演员。

答案 2 :(得分:0)

void*不能安全地用作通用指针到函数类型(尽管你可能可以使用它)。

但是,任何函数到指针值都可以转换为另一种指向函数的类型,然后再返回而不会丢失信息。因此,您可以使用void (*)()(指向函数返回void并且不带参数的指针)作为通用指针到函数类型。

至于存储类型,我不确定是否可行。如果可能性有限,则可以使用枚举类型和switch语句。

但是使用基于继承的设计可能会更好。