Передать указатель на функцию с неявным аргументом C ++ - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть некоторый код, который взаимодействует с двумя внешними библиотеками (то есть вещами, которые я не могу изменить). Первая библиотека имеет функцию 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 - но это ужасно. ..

Итак - как я могу передать функцию-оболочку как указатель на функцию - во время выполнения / динамически?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...