1

「Effective STL」という本を読んでいるときに、著者は a をどのようcopy_ifに記述できるかの例を示しています。これは、標準アルゴリズムには存在しないためです。著者のバージョンは次のとおりです。

template <typename Input, typename Output,typename Predicate>
OutputIterator copy_if(Input begin , Input end, Output destBegin, Predicate p)
{
   while(begin != end)
   {
     if(p(*begin)) *destBegin++=*begin;
     ++ begin;
   }
   return destBegin; 
}

今私の質問は、作者がその方法を次のようにどのように使用できるかです:

copy_if(widg.begin(),widg.end(),ostream_iterator<widg>(cerr,"\n"),isDefective);

私の質問は、テンプレートパラメータがcopy_ifで定義されていないのはなぜですか(3が必要なため)、このように

copy_if<p1,p2,p3>(...)
4

2 に答える 2

5

copy_ifなどの関数テンプレートの場合、コンパイラは関数パラメーターからテンプレート パラメーターの型を推測できます。自分で指定する必要はありませんが、指定してもエラーにはならないと思います。

これは、テンプレート パラメーターを明示的に指定する必要があるクラステンプレートとは異なります。

于 2013-10-05T20:08:22.993 に答える
0

関数テンプレートの型パラメーターは、関数のパラメーターからコンパイラーによって推測できます。例えば:

template<typename T>
auto return_value_type_instance(const std::vector<T>&) -> T
{
    return T();
}

これは C++11 の末尾の戻り値の型の例です。この戻り値の型は、関数にインスタンスをbool渡すstd::vector<bool>場合、char ベクトルを渡す場合は char になります。

int main()
{
    std::vector<bool> a;
    std::vector<char> b;
    std::vector<float> c;

    bool  aa = return_value_type_instance(a);
    char  bb = return_value_type_instance(b);
    float cc = return_value_type_instance(c);
}

または、より一般的な例では、STL のようなアルゴリズム:

template<typename iterator_type>
void print_range(iterator_type begin , iterator_type end)
{
    for(iterator_type it = begin ; it != end ; ++it)
        std::cout << *it << std::endl;
}

int main()
{
    std::vector<int> v = {0,1,2,3};

    print_range(v.begin() , v.end());
}

出力:

0
1
2
3

于 2013-10-05T20:13:58.257 に答える