1
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 的输入和输出类型。你能帮我看到光吗?谢谢

4

1 回答 1

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

更新了添加仿函数版本的代码,问题是需要将函数放在一个类中,而不是作为自由函数。

于 2014-07-16T13:13:36.250 回答