【发布时间】:2011-06-29 10:43:33
【问题描述】:
我想用 C++ 编写一个函数来替换 C 的 sscanf,它将匹配项分配给迭代器。
基本上,我想要这样的东西:
string s = "0.5 6 hello";
std::vector<boost::any> any_vector;
sscanv(s, "%f %i %s", any_vector);
cout << "float: " << any_cast<float>(any_vector[0]);
cout << "integer: " << any_cast<integer(any_vector[1]);
cout << "string: " << any_cast<string>(any_vector[2]);
确切的细节可能会有所不同,但你明白了。有什么实施想法吗?
到目前为止的选项和问题:
- std::istringstream:没有用于匹配常量表达式的操纵器
- Boost.Regex:不确定这是否可行,而且它似乎比必要的复杂得多
- Boost.Spirit:不要认为这适用于动态生成的格式字符串,而且它似乎也比必要的更复杂
- sscanf:它可以工作,但是是非标准的,等等,并且使用它会需要很多开销,因为参数的数量是在编译时确定的
【问题讨论】:
-
你愿意使用 c++0x 概念吗?
-
@Bradley:我认为它们已从该标准的草案中删除?
-
@Bradley:当然。我正在使用 gcc 4.5.1 并使用 -std=c++0x 进行编译,只要它适用于我对它持开放态度。我不想等待一些尚不可用的东西。当然,即使它还没有,我仍然有兴趣了解它,但我现在需要一个解决方案。
-
我猜可变参数模板可能比vector
(类似于en.wikipedia.org/wiki/C%2B%2B0x#Variadic_templates)更方便,尽管解析格式字符串仍然是最大的问题。 -
@UncleBens:谢谢,我会调查这些,但你说得对,它们不能解决我的主要问题。
标签: c++ boost boost-spirit boost-regex boost-spirit-qi