C++ C++;按任何模式将任何字符串类型拆分(解析)为用户指定的参数
有没有一种方法可以编写通用算法,使用用户提供的参数列表和用户定义的模式来解析用户定义类型的字符串? 示例代码:C++ C++;按任何模式将任何字符串类型拆分(解析)为用户指定的参数,c++,c++11,templates,unicode,stl,C++,C++11,Templates,Unicode,Stl,有没有一种方法可以编写通用算法,使用用户提供的参数列表和用户定义的模式来解析用户定义类型的字符串? 示例代码: template <typename CharT, typename ...Args> bool parse_string_to_args(std::basic_string<CharT> string, const CharT* pattern, Args&&... args) {
template <typename CharT, typename ...Args>
bool parse_string_to_args(std::basic_string<CharT> string,
const CharT* pattern, Args&&... args)
{
// for char: I'd use sscanf
auto ret = sscanf(string.c_str(), pattern, &args...);
if (ret == std::char_traits<char>::eof())
return false;
return true;
// for wchar: swscanf ...
}
模板
bool parse_string_to_args(std::basic_string,
常量图表*模式,参数&&…参数)
{
//对于char:我会使用sscanf
auto-ret=sscanf(string.c_str()、pattern和args…);
如果(ret==std::char\u traits::eof())
返回false;
返回true;
//对于wchar:swscanf。。。
}
当然,示例代码非常糟糕。如果C++有一个……/p>,我需要一个基于C++的标准库的SCASNF模板。
utf-8
或utf-16
能保证什么吗wchar\u t
似乎并不总是解析符号,所以我宁愿不使用它注意:如果有跨平台的方法(基本上是标准库),那就太好了。Linux是最高优先级。标题
提供与utf8
和utf16
之间的转换。其中一些可以输入您的
,以满足您的需要。也是第一个片段:
。我还找到了一些关于std::basic_stringstream
(在我的例子中,甚至是istringstream
)的答案。这与问题2密切相关一些国际类型(我想,类似unicode)可以解决这个问题,然后我可以在必要时安全地使用
。这在某种程度上是对那里不安全的遗憾。与std::basic_stringstream
方法相比,它将允许更大的灵活性。我想知道,我是否可以用regexp做些什么……我不确定这对于任意用户定义的类型应该如何工作。您需要知道至少一些字符在图表中是如何表示的
;e、 g.你怎么知道一个两元素的模式
以某种方式表示“%d”
,而一个两元素的字符串
表示“42”
?至少,您需要一个同义词来表示'\0'
,因为您没有为模式
@IgorTandetnik传递长度。我希望用户知道如何根据图表正确定义模式和字符串。例如,如果CharT=wchar\u t
则pattern=L“%lc”
-查找单个字符(如果这是您的意思)。感谢您对“0”的评论,我认为我应该考虑长度< <代码>模式< /代码>。如果我可以的话,我想远离任何关于模式的知识:只需把数据传递给sSCANF的某种通用的替代品,不必理会——让C++做所有的工作。您没有要求只为<代码> char < /> >和<代码> W查尔特特< /代码>的函数。(这很容易处理-只需分派到sscanf
或swscanf
)。您要求的函数可以处理任意用户定义类型的序列。假设我有struct-Weird{char getChar()const;/*其他成员*/};
并声明Weird
的每个实例都表示getChar()的字符
返回。parse_string_to_args
是否需要处理这些问题?您需要在图表上提出一些要求,才能使问题陈述有意义-这些要求是什么?您试图解决什么问题?