为什么在模板函数中使用iterator_traits而不是仅使用另一个模板类型参数?

里希拉吉·苏蒂(Rishiraj Surti)

例如,参考cplusplus.com的此代码段

template <class InputIterator, class T>
typename iterator_traits<InputIterator>::difference_type
count(InputIterator first, InputIterator last, const T& val)
{
    typename iterator_traits<InputIterator>::difference_type ret = 0;
    while (first!=last) {
        if (*first == val)
            ++ret;
        ++first;
    }
    return ret;
}

问题是为什么要iterator_traits在这种情况下使用而不是采用另一个模板参数,如下所示:

template <class InputIterator, class T, class DiffType>
DiffType count(InputIterator first, InputIterator last, const T& val)
{
    DiffType ret = 0;
    while (first!=last) {
        if (*first == val)
            ++ret;
        ++first;
    }
    return ret;
}
templatetypedef

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

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!

这里的问题是,为了调用功能模板,每个模板参数要么必须可以从参数类型中推导出,要么必须由调用者明确指定。在这里,DiffType不能从参数类型推断出类型(可以从两个参数推断出InputIteratorandT类型,但是仅从签名就没有上下文),因此该调用将因编译器错误而失败。这里使用的std::iterator_traits是一种通用的模板模式,用于从迭代器类型本身中提取有关迭代器的信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在另一个函数中使用模板函数作为模板参数

如何在C ++中的另一个模板函数中使用属于模板化类的嵌套类型?

在C ++中,为什么不能使用另一个类的模板类型来与模板类成员函数成为朋友?

在另一个模板声明中使用默认模板参数

在模板参数的功能中使用一个或另一个名称空间

使用模板可变参数将多个参数传递给另一个函数

使用函数的返回类型作为另一个模板函数的调用

如何使用当前类模板作为另一个模板的模板参数?

从另一个文件调用函数以在模板中使用

为什么 C++ 不能单独从函数指针原型推导出模板类型参数,而不是作为一个包?

使用另一个模板的模板

使用另一个模板的模板特化

检查模板参数类型是否被另一个函数接受的static_assert

我可以在Golang的另一个模板中使用模板变量吗?

在另一个类模板中使用类模板

在函数模板中,如何根据另一个参数确定一个参数的类型

当类是另一个模板的模板参数时,可以使用类模板参数推导吗?

为什么不从另一个函数中调用一个函数而不是使用回调呢?

在Angularjs中的另一个指令模板中使用一个指令

为什么一个组件的模板会扩展另一个组件的模板?

将一个函数模板的模板参数映射到另一个 (c++) 的模板参数

渲染一个完整的树枝模板,在Symfony中使用ajax扩展另一个模板

模板化函数可以是另一个函数的模板参数吗?

为什么仅针对一个参数,可变参数模板与非可变模板不同?

在另一个应用程序中使用另一个Django应用程序的模板

如何存储在模板帮助器函数中计算的值并在另一个模板函数中使用它们?

访问另一个模板中的模板参数

如果模板参数是另一个模板的某个实例,则类型特征测试

c++ type_traits:为什么我不能从另一个模板/ enable_if 行调用模板化静态方法?