我想存储函数的void指针以及它们的类型
I want to store void pointers to functions along with the type of them
我正在尝试使vector保存指向函数的void指针,稍后将顺序调用。
假设我有三个函数。int a()
, void b();
, bool c();
向量是vector<void *> vec;
和我的函数存储指向函数的指针。
void registerFunction(void *func)
{
vec.push_back(func);
}
现在我的问题是当尝试调用存储的所有函数时,因为它们都是void指针,我只是不能在不知道它们的类型的情况下调用函数。
所以我的问题是……是否有任何方法来存储符号类型,以便我可以将它们与各自的指针相关联,然后在调用函数的void指针时进行类型转换?注意:函数不会总是类型,例如,void (*)()
,我也想添加方法,因此ie。void (someclass::)()
。是不是要求太多了?它会起作用吗?
不能将函数指针转换为void*
。这是不允许的
如果所有的函数都可以用零参数调用,你不关心返回类型,你可以使用std::vector<std::function<void()>>
(function
也可以在Boost和TR1中找到,如果你的c++标准库不支持它)。
但是,如果我没记错的话,在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中不再允许。我可能是错的,如果有人知道,我希望在评论中澄清。
void*
不能安全地用作指向函数的泛型指针类型(尽管您可能能够避开它)。
但是,任何函数到指针的值都可以转换为另一种指针到函数的类型,然后再转换回来,而不会丢失信息。因此,您可以使用,例如,void (*)()
(指向返回void且不接受参数的函数的指针)作为指向函数的泛型指针类型。
至于存储类型,我不确定这是否可能。如果可能性有限,可以使用枚举类型和switch语句。
只要所有函数都遵循相同的类型签名,就可以将void指针强制转换回该类型。
一个更好的解决方案是定义函数的类型:typedef int(*fun_ptr)();
vector<fun_ptr> vec;
- 引用一个已擦除类型(void*)的指针
- 错误:"cast"未命名类型void setCastDescription(std::string
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 从类型"void*"到函数指针的强制转换无效
- C++错误(从不兼容的类型"void"分配给树节点*)
- 从不兼容的类型 'void (Button::*)(int)' 分配给'void (*)(int)'
- 从类型"void*"到类member_function指针的强制转换无效
- 将 false 转换为指针类型 void*
- 称为对象类型"void (B::*)(int)"不是函数或函数指针
- CPP(15): 错误 C2182:"输入":"非法使用类型"void"
- 类型 "void (Biometria::*)(char *idSensor, GRCAP_FINGER_EVENTS event)" 的参数与类型 "GRCAP_STATUS_EVENT_PROC
- Xcode 变量具有不完整的类型 void
- qvector.h(74):错误 C2182:'t':非法使用类型 'void'
- C 函数声明对类型"void(*fcn)(void*)"参数的说明
- C++从类型“void*”转换为类型“double”无效
- LAMBDA 错误:类型 'void' 的条件表达式是非法的
- 类型 void 的值不允许在 C++ 中出错
- 从类型 'MyStruct' 转换为类型 'void*' 无效
- C++,参数类型(void*&)的目的是什么?
- 无法将不完整类型'void *'的参数转换为'const bitData'