我正在尝试创建一个向量保持指向函数的void指针,稍后将被称为secuentially
所以,让我说我有三个功能。 int a()
,void b();
,bool c();
我的矢量是vector<void *> vec;
我的函数存储指向函数的指针。
void registerFunction(void *func)
{
vec.push_back(func);
}
现在我的问题是在尝试调用存储的所有函数时,因为它们都是无效指针,我只是在不知道它们的类型的情况下无法调用函数。
所以我的问题是......有没有办法存储符号类型,所以我可以将它们与各自的指针相关联,然后在调用函数的void指针时进行类型转换?
注意:函数不一定是类型,例如void (*)()
,我也想添加方法,因此即。 void (someclass::)()
。它要求太多了吗?它应该有用吗?
答案 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语句。
但是使用基于继承的设计可能会更好。