C++ 部分模板特化:如何特化 std::iterator_category

标签 c++ template-specialization partial-specialization

我想编写带有 2 个迭代器或指针的模板函数 void foo()。

我想要一个专门用于 random_access_iterator 的版本。我试着像下面这样写:

// generic version
template<class Iter, typename std::iterator_traits<Iter>::iterator_category>
void foo(Iter first, Iter last);

// Specialized version for random_access_iterator
template<class RandomIter>
void foo<RandomIter, std::random_access_iterator_tag>(RandomIter first, RandomIter last)
{
}

它给出错误:非法使用显式模板参数

请让我知道定义它的正确方法是什么。谢谢

最佳答案

您不能部分特化函数模板。部分特化仅适用于类模板。您可以做的是只有一个函数模板,该模板委托(delegate)给适当专门化的类模板的 static 成员,例如

template <typename Iter,
          typename = typename std::iterator_traits<Iter>::iterator_category>
struct foo_impl {
    static void call(Iter first, Iter last);
};

template <typename Iter>
struct foo_impl<Iter, std::random_acces_iterator_tag> {
    static void call(Iter first, Iter last);
};

templlate <typename Iter>
void foo(Iter first, last) {
    foo_impl<Iter>::call(first, last);
}

或者,您可以使用部分排序。在这种情况下,有两个函数模板,一个以通用迭代器类别作为参数,另一个以特定类别作为参数。类别或指向它的指针作为附加参数传递。我认为这也需要转发功能(我通常使用使用类模板的部分特化的方法)。

关于C++ 部分模板特化:如何特化 std::iterator_category,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20206466/

相关文章:

c++ 相同的代码从不在 Visual Studio 中编译/运行,有时在 Qt Creator 中编译/运行

c++ - 为什么 std::vector::insert 需要复制赋值?

c++ - 我的与 COM 相关的代码有什么问题?

c++ - <character*> 仅使用 cin 附加最后一个输入

c++ - 函数专用模板问题

c++ - 模板类构造函数的特化

c++ - 实现 `to_xstring()` 来合并 `to_string()` 和 `to_wstring()`

c# - 将数组本身实现为 `.CopyTo(Array,int)` 作为目标数组(要复制到)

c++ - 部分模板参数应用程序的部分模板特化不适用于 GCC 4.8.1

c++ - 可变模板的部分特化需要第一个非可变模板参数