передача функции в качестве типа шаблона и вычитание ее типов в переполнении стека

double f(const int& i) { return 1.5 * i;  }

template<
typename _out,
typename _in,
_out (*__f)(const _in&)>
class X {}; // template <... __f> class X {};

int main()
{
X<double, int, f> x; // X<f> x;
}

Как я могу упростить этот код?
Я хочу написать код, как в комментариях.
C ++ 11 result_of и decltype, кажется, помогают, но я недостаточно умен, чтобы написать правильный код для определения типов ввода и вывода функции f внутри класса.
Можете ли вы помочь мне увидеть свет?
Спасибо

1

Решение

Просто удалите параметр _out и _in и измените параметр на std :: function:

#include <functional>
#include <iostream>

double f(const int &i) { std::cout << "Func F" << std::endl; return 1.5 * i; }

struct functor_of_f {
double operator()(const int &i)
{ std::cout << "Func F" << std::endl; return 1.5 * i; }
};

template <typename T> class X {
public:
X(T t) { std::cout << t(5) << std::endl; }
X() { std::cout << T()(5) << std::endl; }
}; // template <... __f> class X {};

int main(int argc, char* argv[]) {
typedef std::function<double(int)> f_func;
X<f_func> x1(f);
X<decltype(f)> x2(f);
X<std::function<double(int)>> x3(f);

X<functor_of_f> x4;
return 0;
}

Обновлен код с добавлением версии функтора, проблема в том, что нужно иметь функцию в классе, а не как свободную функцию.

1

Другие решения