Я создал MCVE для работы над проблемой, а не код.
Итак, давайте предоставим универсальную функцию с именем print()
, которую мы хотим отправить вашему execute()
template <typename Arg>
inline void print(Arg const & a) {
std::cout << a << std::endl;
}
, где execute()
:
template <typename F, typename... A>
inline void execute(F&& functor, A&& ... args) {
std::forward<decltype(functor)>(functor)(std::forward<decltype(args)>(args)...);
}
Когда мы пытаемся позвонить execute(print, 10)
, это не получается.
Проблема в том, что функция execute()
не понимает, какую перегрузку из print
мы пытаемся вызвать.
Теперь эту проблему можно решить двумя способами:
Первый подход, укажите полный тип шаблонной функции:
execute(print<int>, 10);
Второй подход, создать вспомогательную функцию.
Каждая проблема может быть решена добавлением еще одного слоя .
Эта вспомогательная функция поможет нам определить типы, прежде чем мы передадим ее в execute()
template <typename Arg>
inline void execute_print(Arg const & a) {
execute(print<Arg>, a); // we need to specify which overload to be invoked
}
И тогда вы можете позвонить: execute_print(20);
Вот полный рабочий код для вашей справки (скомпилирован с использованием C ++ 11):
#include <string>
#include <iostream>
template <typename Arg>
inline void print(Arg const & a) {
std::cout << a << std::endl;
}
template <typename F, typename... A>
inline void execute(F&& functor, A&& ... args) {
std::forward<decltype(functor)>(functor)(std::forward<decltype(args)>(args)...);
}
template <typename Arg>
inline void execute_print(Arg const & a) {
execute(print<Arg>, a); // we need to specify which overload to be invoked
}
int main() {
// execute(print, 5); // wont compile
execute(print<int>, 10);
execute_print(20);
return 0;
}