1

在阅读“Effective STL”一书时,作者给出了一个如何copy_if编写 a 的示例,因为这在标准算法中不存在。这是作者的版本:

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 尾随返回类型的示例,如果将实例传递给函数,则返回类型将是boolstd::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 回答