我想编写带有 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/