可以在自定义字符串类型上使用regex_iterators吗?

时间:2017-10-12 12:52:54

标签: c++ regex

我只找到regex_iterators被推定为

的示例
regex_iterator::<string::iterator>

如果我有一个包含一系列字符的类,例如:

class fooString {
private:
  deque<bar> data;

  // ... other functionality ...
}

bar是与std::to_string

兼容的类或结构

如何让fooStringbar与正则表达式兼容,以便我可以调用

fooString myFoo = ...
regex e( /* some regex notation */);
regex_iterator::<fooString::iterator> regIt(myFoo.begin(), myFoo.end(), e);

...并且能够像对待字符串那样迭代它吗?

我尝试了以下体验:

    std::deque<int> testDeque { 4, 5, 5, 5, 6, 7 };
    std::regex e("5{1,3}");
    std::regex_iterator<std::deque<int>::iterator> 
    regIt(testDeque.begin(), testDeque.end(), e);

并获得编译错误

1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\regex(2271): error C2027: use of undefined type 'std::regex_traits<_Elem>'
with  
[  
   _Elem=int  
]

所以我不认为双向迭代器就足够了,因为deque符合它,我认为'bar'对象需要兼容。但我真的不确定。

1 个答案:

答案 0 :(得分:2)

fooString必须满足双向迭代器的要求。 [bidirectional.iterators] cppreference's documentation 非常接近标准用语,所以你可以关注它。

我将在此处添加相关部分:

  • 迭代器r必须满足操作--rr++
    • 这些操作返回对同一类型的迭代器的引用
  • *r必须返回对迭代器迭代的类型的引用。
      根据{{​​1}} 的cppreference列表,
    • reference类型

如果您的iterator_traits不是标准字符类型(您可以使用BidirectionalIterator::value_type制作std::basic_string的任何内容),那么您还需要专门化regex_traits虽然这个兔子洞已经下降了。