STL容器的迭代器的模板专业化?

天花

我试图编写一个类似于std::to_string基本类型以及STL容器迭代器的模板函数但是我不确定如何编写足够具体的模板以仅标识迭代器。

我到目前为止尝试的是尝试iterator在STL容器中使用typedef

  template<typename... Args, template <typename...> class Container>
  static string to_string(typename Container<Args...>::iterator s) { ...

下面是一个最小的示例。代码可以编译,但是模板函数My::to_string无法匹配上述签名,因此被std::set<int>::iterator视为默认类型。

我的问题是如何以通用方式正确编写此代码,以便模板函数My::to_string可以拾取迭代器,但不要将迭代器与,等其他标准模板类型混淆std::string

提前致谢。

#include <set>
#include <iostream>
using namespace std;

class My{
  //base case
  template<typename T>
  static string to_string(const T& t) {
    return "basic ";
  }

  //specialization for string
  template <typename Char, typename Traits, typename Alloc>
  static string to_string(const std::basic_string<Char, Traits, Alloc>& s) {
    return (string)s;
  }

  //Problem line: how to write specialization for iterators of standard containers?
  template<typename... Args, template <typename...> class Container>
  static string to_string(typename Container<Args...>::iterator s) {
    return "itor ";
  }
};

int main() {
  int i =  2;
  string str = "Hello";
  set<int> s;
  s.insert(i);
  cout << to_string(i) << ", " << str << ", "
       << to_string(s.begin()) << endl;   //didn't get captured by iterator spec.
}

输出:

basic, Hello, basic

所需的输出:

basic, Hello, itor
TC

如果只关心参数迭代性,而不关心容器的类型,则可以SFINAE消除其他重载。

首先做出一个is_iterator特征,如以下答案所示

template <typename T>
struct sfinae_true : std::true_type {};

struct is_iterator_tester {
    template <typename T>
    static sfinae_true<typename std::iterator_traits<T>::iterator_category> test(int);

    template <typename>
    static std::false_type test(...);
};

template <typename T>
struct is_iterator : decltype(is_iterator_tester::test<T>(0)) {};

现在,SFINAE会根据类型是否为迭代器来解决错误的重载:

//base case
template<typename T>
static std::enable_if_t<!is_iterator<T>::value, string> to_string(const T& t) {
  return "basic ";
}

//specialization for string
template <typename Char, typename Traits, typename Alloc>
static string to_string(const std::basic_string<Char, Traits, Alloc>& s) {
  return (string)s;
}

//Problem line: how to write specialization for iterators of standard containers?
template<typename T>
static std::enable_if_t<is_iterator<T>::value, string> to_string(const T& s) {
  return "itor ";
}

演示

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有STL容器的部分C ++模板专业化

来自分类Dev

模板专业化容器

来自分类Dev

使用STL的部分模板专业化

来自分类Dev

容器类型的模板专业化

来自分类Dev

具有容器模板的总类模板专业化

来自分类Dev

如何基于作为STL容器的模板参数模拟所选成员函数的部分专业化?

来自分类Dev

模板化的函数专业化:链接器错误

来自分类Dev

模板化的函数专业化:链接器错误

来自分类Dev

Rust中的多个专业化迭代器模式

来自分类Dev

使用模板专业化

来自分类Dev

模板专业化示例

来自分类Dev

模板:课程专业化

来自分类Dev

部分模板专业化

来自分类Dev

模板专业化问题

来自分类Dev

C ++模板专业化

来自分类Dev

C ++编译器优化放弃模板专业化

来自分类Dev

带有模板的构造器专业化

来自分类Dev

C ++模板专业化朋友迭代器错误:无效使用不完整类型

来自分类Dev

当广义STL容器的迭代器的值类型未知时,如何使用模板化迭代器?

来自分类Dev

模板化类的模板专业化

来自分类Dev

模板化类型的模板专业化

来自分类Dev

模板类的模板功能专业化

来自分类Dev

模板专业化中的模板

来自分类Dev

C ++部分模板模板专业化

来自分类Dev

部分模板模板矢量专业化

来自分类Dev

模板专业化:不是模板

来自分类Dev

模板参数的模板专业化

来自分类Dev

类地图容器和类向量容器之间的歧义模板专业化

来自分类Dev

模板专业类中的模板专业化