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

functor バージョンを追加するコードを更新しました。問題は、関数をクラス内に持つ必要があり、フリー関数としては必要ないことです。

于 2014-07-16T13:13:36.250 に答える