Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在模板函数中使用迭代器特性,而不只是使用另一个模板类型参数?_C++_Templates_Stl_Iterator Traits - Fatal编程技术网

C++ 为什么在模板函数中使用迭代器特性,而不只是使用另一个模板类型参数?

C++ 为什么在模板函数中使用迭代器特性,而不只是使用另一个模板类型参数?,c++,templates,stl,iterator-traits,C++,Templates,Stl,Iterator Traits,例如,从以下位置引用此代码段: 您在注释中提出的建议(让函数接受另一个模板参数)将无法按预期工作。以下是您建议的代码: template <class InputIterator, class T, typename DiffType> DiffType count(InputIterator first, InputIterator last, const T& val) { DiffType ret = 0; while (first!=last) {

例如,从以下位置引用此代码段:


您在注释中提出的建议(让函数接受另一个模板参数)将无法按预期工作。以下是您建议的代码:

template <class InputIterator, class T, typename DiffType>
DiffType count(InputIterator first, InputIterator last, const T& val)
{
    DiffType ret = 0;
    while (first!=last) {
        if (*first == val)
            ++ret;
        ++first;
    }
    return ret;
}
模板
DiffType计数(先输入计数器,后输入计数器,常数T&val)
{
DiffType-ret=0;
while(第一个!=最后一个){
如果(*first==val)
++ret;
++第一,;
}
返回ret;
}
此代码的问题是不再编译:

std::vector<int> v = /* ... */;
auto numElems = count(v.begin(), v.end(), 137); // <--- Error!
std::vector v=/*…*/;

自动计数=计数(v.begin(),v.end(),137);//这是相当广泛的,但我要试一试:迭代器特性,事实上,一般特性(如成员类型)在适当的约定下工作得很好。通过按惯例使用“标准”特性,一个算法和数据结构与标准模板库的其余部分配合得很好,实现了更好的元编程。可以定义另一个模板类,但一旦我们做了一次,我们就不想再做了,因为每一个不同的算法HMI可能都很密集,但是你能举一个例子说明你在最后一句话中的想法吗?现在还不清楚你在问什么。你是在问为什么我们要使用traits类,或者为什么这段代码特别使用了
迭代器\u traits
类作为它的traits类?如果我听起来很奇怪,请原谅,但我在想我是否可以这样做:
模板另一个计数(…){anotherT ret=0;…return ret;}
嗯,DiffType至少可以是第一个模板参数。仍然不是所有的事情都可以推断,但是更好一点…@BoPersson哦,说得对。我相信我所做的编辑修复了这个问题?@Deduplicator在这种情况下,您是否仍然需要显式地提供差异类型?
auto ret{}格式不正确。至少使用一次
difference\u type
是没有好办法的。您正确地认为difference类型将是整数类型-问题在于使用哪种整数类型,这取决于您使用的迭代器的类型。迭代器特性是一种恢复信息的方法,这种信息取决于基础迭代器类型。由于无论底层迭代器类型如何,
equal
始终返回布尔值,因此它不需要使用迭代器特性。
template <class InputIterator, class T, typename DiffType>
DiffType count(InputIterator first, InputIterator last, const T& val)
{
    DiffType ret = 0;
    while (first!=last) {
        if (*first == val)
            ++ret;
        ++first;
    }
    return ret;
}
std::vector<int> v = /* ... */;
auto numElems = count(v.begin(), v.end(), 137); // <--- Error!