gsl :: span无法使用std :: regex进行编译

时间:2016-02-24 23:08:51

标签: c++ regex c++11 guideline-support-library

我试图使用gsl::span将混合二进制/ ascii数据的压缩结构中的一些数据(因此没有vectorstring)传递给函数,其中我想用正则表达式对它进行操作,但是我得到以下错误:

  

错误C2784:' bool std :: regex_match(_BidIt,_BidIt,std :: match_results< _BidIt,_Alloc>&,const std :: basic_regex< _Elem,_RxTraits>&,std :: regex_constants: :match_flag_type)' :无法推断' std :: match_results>,_ Alloc>的模板参数&安培;'来自' std :: cmatch'

     

参见' std :: regex_match'

的声明

这是我想要做的事情:

#include <regex>
#include "gsl.h"

using namespace std;
using namespace gsl;

int main(int argc, const char **argv) 
{
    char lat[8] = { '0', '1', '9', '0', '0', '0', '0', 'E' };
    span<char> s = lat;

    // in a complex implementation this would be in a function,
    // hence the desire for span<>
    std::cmatch match;
    std::regex_match(s.begin(), s.end(), match, std::regex("[0-9]+"));
}

1 个答案:

答案 0 :(得分:2)

问题是当迭代器类型为std::regex_match时,gsl::continuous_span_iterator无法解析函数重载,因为std::cmatch使用const char*作为迭代器类型。在这种情况下,std::smatchstd::cmatch都不合适,您需要自己的std::match_results类型。以下是应该如何做的:

#include <regex>
#include "gsl.h"

using namespace std;
using namespace gsl;

int main(int argc, const char **argv) 
{
    char lat[8] = { '0', '1', '9', '0', '0', '0', '0', 'E' };
    span<char> s = lat;
    std::match_results<decltype(s)::iterator> match;
    std::regex_match(s.begin(), s.end(), match, std::regex(".*"));
}

也就是说,在撰写本文时,由于issue #271,修订后的迭代器方法仍然无法编译。

在此问题解决之前,另一个解决方法是:

int main(int argc, const char **argv) 
{
    char lat[8] = { '0', '1', '9', '0', '0', '0', '0', 'E' };
    span<char> s = lat;
    std::cmatch match;
    std::regex_match(&s[0], &s[s.length_bytes()], match, std::regex(".*"));
}

变通方法涵盖了将相同或不同范围的跨度传递给函数的情况。