我有一些与两个外部库连接的代码(即我无法修改的东西)。第一个库的函数foo带有以下声明
template <typename T, typename Tfrom>
foo(Tfrom (T::*function)())
例如一个函数指针,它期望一个返回某种类型且没有参数的函数。在运行时的程序中,我需要访问第二个外部库以枚举要传递给第一个库的所有可能的函数。伪代码看起来像
//grab pointer to class and get all the shared pointers
std::map<int, ::class2:sptr> my_map = _class2_ptr->get_sptrs()
//for every key in the map we have a function that can be called like
for(auto const& k : my_map)
{
int returnval = k.second->get_data(k.first);
}
换句话说,函数声明看起来像(必须知道sptr才能访问它)。
int get_data(int)
一种解决方案是像这样创建模板包装器
template<int k>
int get_data_template()
{
return my_map.at(k)->get_data(k);
}
但是,这是行不通的,因为my_map会在运行时调整大小,并且如果您尝试调用此模板,例如:
get_data_template<k>();
仅当k为const时才有效(例如,参见https://ideone.com/EerO9N)。一种解决方法是假设我们枚举的条目数的最大上限,然后使用模板递归使for循环编译时-但这太可怕了...
那么-如何在运行时/动态地传递包装函数作为函数指针?