在代码中,我在一个管理类中注册了一个或多个函数指针。在这个类中,我有一个映射表,将函数的参数类型映射到该函数。它可能看起来像这样:
每次从脚本中调用时,我都必须找出要调用哪个函数,然后调用它。前者很容易解决(在循环中使用
我的第一种方法是使用可变参数模板进行递归,并为每个读取类型添加一个模板参数-但是这被证明是不可能的,因为模板是在编译时构造的,而任意数量的参数是在运行时读取的。
但是如果没有可变参数模板,我看不到任何实现这一点的可能性。我考虑使用
std::map< std::vector<std::type_index> , void*>
。template<typename Ret, typename... Args>
void Register(Ret(*function)(Args...)) {
void* v = (void*)function;
// recursively build type vector and add to the map
}
在运行时,代码会接收来自外部脚本的调用,并带有任意数量的参数。这些参数可以被读取为原始数据类型或作为在编译时指定的自定义类型。
每次从脚本中调用时,我都必须找出要调用哪个函数,然后调用它。前者很容易解决(在循环中使用
type_index
填充向量),但是我想不到后者的解决方案。我的第一种方法是使用可变参数模板进行递归,并为每个读取类型添加一个模板参数-但是这被证明是不可能的,因为模板是在编译时构造的,而任意数量的参数是在运行时读取的。
但是如果没有可变参数模板,我看不到任何实现这一点的可能性。我考虑使用
boost::any
代替void*
,但我没有看到它如何解决需要强制转换回原始类型的问题。我也考虑过使用std::function
,但那将是一个带有模板的类型,因此无法存储具有不同参数的函数的映射。
如果我的问题不清楚,请考虑LuaBinds支持注册重载函数的可能性。我试图理解它是如何实现的(没有可变参数模板,没有C++11),但是没有成功。
void*
和函数指针之间进行转换,但标准的C和C++不支持这样做。 - Cheers and hth. - Alfvoid*
/转换解决方案!这只是我能想到的。 - Appleshelltemplate<class T> void wrapper(void* p) { static_cast<T*>(p)->whatever(); } void(*f)(void*) = wrapper<MyFirstType>; f = wrapper<MySecondType>;
等等。 - dypstd::function
和std::bind
的功能吗? - Steve Lorimerstd::bind
和std::function
的解决方案会很棒!我之前没有考虑过std::bind
,因为在我做的研究中没有提到过它。 - Appleshell