Слишком поздно играть?
Я предлагаю другое решение, основанное на характеристике нестандартного типа (со специализацией для void
), которое, учитывая тип T
, определяет правильное std::function
type
;я имею в виду
template <typename T>
struct getFuncType
{ using type = std::function<void(T)>; };
template <>
struct getFuncType<void>
{ using type = std::function<void()>; };
Таким образом, ваш ExecuteFunction()
просто станет
template <typename T>
void ExecuteFunction (typename getFuncType<T>::type f)
{
}
Если вы хотите немного упростить использование getFuncType
, вы можете добавить помощника using
кизвлеките type
template <typename T>
using getFuncType_t = typename getFuncType<T>::type;
, чтобы ExecuteFunction()
можно было упростить следующим образом
template <typename T>
void ExecuteFunction (getFuncType_t<T> f)
{
}