Передавая функцию как тип шаблона и вычитая ее типы в C++

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;
}

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

Другие вопросы по тегам