У меня есть некоторый код, который взаимодействует с двумя внешними библиотеками (то есть вещами, которые я не могу изменить). Первая библиотека имеет функцию foo со следующим объявлением
template <typename T, typename Tfrom>
foo(Tfrom (T::*function)())
, например, указатель на функцию, которая ожидает функцию, которая возвращает некоторый тип и не имеет аргументов. В моей программе во время выполнения мне нужно получить доступ ко второй внешней библиотеке, чтобы перечислить все возможные функции, которые я буду передавать первой библиотеке. Код Psuedo выглядит примерно так:
//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 является константой (например, см. https://ideone.com/EerO9N). Обходной прием предполагает принятие максимального верхнего предела для числа перечисляемых нами элементов, а затем использование рекурсии шаблона для создания времени компиляции цикла for - но это ужасно. ..
Итак - как я могу передать функцию-оболочку как указатель на функцию - во время выполнения / динамически?