1

関数を引数として取る次の関数を考えてみましょう。

template <class Function = std::plus<int> > 
void apply(Function&& f = Function());

std::plus<int>適用されるデフォルトの関数は次のとおりです。std::plus<int>は関数オブジェクトであり、すべてうまく機能します。

std::forward<int>ここで、デフォルトの引数として渡したいと思います。std::forward<int>は関数オブジェクトではありません。これは関数ポインタです。どうやってするか ?

template <class Function = /* SOMETHING */ > 
void apply(Function&& f = /* SOMETHING */);
4

2 に答える 2

2

私はこれがうまくいくと思います:

template <class Function = decltype(&std::forward<int>)> 
void apply(Function&& f = &std::forward<int>);

編集:実際にはそうではないかもしれません。オーバーロードするだけのほうがよいでしょう:

void apply() {
  apply(&std::forward);
}
于 2013-03-05T06:51:46.270 に答える
2

への関数ポインターの型std::forward<int>は ですint &&(*)(int &)。したがって、関数は次のようになります。

template<class T = int &&(*)(int &)>
void apply(T &&t = &std::forward<int>);

std::forward の宣言方法を見てみましょう: http://en.cppreference.com/w/cpp/utility/forward

于 2013-03-05T07:02:30.413 に答える