3

std :: for_eachを使用して、さまざまなタイプを含む可能性のあるベクトルのコンテンツを出力しようとしています。だから私は次のような一般的な出力関数を書きました:

template<typename T> void output(const T& val)
{
    cout << val << endl;
}

一緒に使用したいもの:

std::for_each(vec_out.begin(), vec_out.end(), output);

しかし、コンパイラはfor_eachステートメントで「テンプレート引数を推測できませんでした」と文句を言います。また、「関数テンプレートを別の関数テンプレートの引数にすることはできません」と文句を言います。

これは不可能ですか?コンパイラはvec_o​​utのタイプ(ベクトル)を知っていると思っていたので、関数「output(const double&val)」をインスタンス化する必要がありますか?

これが機能しない場合、手動ループを作成せずに同様のSTL機能を取得するにはどうすればよいですか?

私はC++にまったく慣れておらず、まだロープを学んでいます:-)

4

3 に答える 3

9

試す:

std::for_each(vec_out.begin(), vec_out.end(), output<T>);

ここで、はタイプTvec_outのコンテナ( )です。vector

注:for_eachアルゴリズムは、最後の引数に単項ファンクターを想定しています。ファンクターの使用例については、リンクを参照してください。

于 2009-04-22T09:11:54.447 に答える
7

テンプレートのインスタンス化を渡す必要があります。output<int>あなたのベクトルが整数のベクトルであるかのようなもの。

例えば:

template<typename T> void output(const T& val)
{
    cout << val << endl;
}



void main(int argc,char *argv[])
{
    std::vector<int> vec_out;
    std::for_each(vec_out.begin(), vec_out.end(), output<int>);
}   
于 2009-04-22T09:10:44.713 に答える
7

正しい答えに追加したいのですが、テンプレート関数を関数オブジェクト(別名ファンクター)でラップすると、コンパイラーは型を推測できます。

struct OutputFunctor
{
  template <typename T>
  void operator()(const T& val) const { output(val); }
};

void test()
{
  std::vector<int> ints;
  std::vector<float> floats;

  std::for_each(ints.begin(), ints.end(), OutputFunctor());
  std::for_each(floats.begin(), floats.end(), OutputFunctor());
}
于 2009-04-22T10:30:07.767 に答える