gpt4 book ai didi

c++ - 使用模板实现通用字符串解析器

转载 作者:行者123 更新时间:2023-11-28 07:50:48 25 4
gpt4 key购买 nike

我正在尝试提出一个解析字符串(具有给定格式)的通用解决方案。例如,我希望能够解析包含数值列表(整数或 float )的字符串并返回一个 std::vector。这是我目前所拥有的:

template<typename T, typename U>
T parse_value(const U& u) {
throw std::runtime_error("no parser available");
}

template<typename T>
std::vector<T> parse_value(const std::string& s) {
std::vector<std::string> parts;
boost::split(parts, s, boost::is_any_of(","));
std::vector<T> res;
std::transform(parts.begin(), parts.end(), std::back_inserter(res),
[](const std::string& s) { return boost::lexical_cast<T>(s); });
return res;
}

此外,我希望能够解析包含其他类型值的字符串。例如:

struct Foo { /* ... */ };

template<>
Foo parse_value(const std::string& s) {
/* parse string and return a Foo object */
}

维护 parse_value 函数的单一“层次结构”的原因是,有时,我想使用 boost::optional 解析可选值(可能存在或不存在)。理想情况下,我希望只有一个 parse_optional_value 函数可以委托(delegate)相应的 parse_value 函数:

template<typename T>
boost::optional<T> parse_optional_value(const boost::optional<std::string>& s) {
if (!s) return boost::optional<T>();
return boost::optional<T>(parse_value<T>(*s));
}

到目前为止,我当前的解决方案不起作用(编译器无法推断出要使用的确切函数)。我想问题是我的解决方案依赖于根据 parse_value 函数的返回类型推导模板值。我不太确定如何解决这个问题(或者甚至是否有可能解决它,因为设计方法可能完全有缺陷)。有谁知道解决我想做的事情的方法?如果您能指出一种可能的方法来解决我当前实现中遇到的问题,我将不胜感激。顺便说一句,我也绝对愿意接受完全不同的想法来解决这个问题。

最佳答案

您不能根据返回值 [1] 重载函数。这正是标准 IO 库使用结构的原因:

std::cin >> a >> b;

这可能不是您的小菜一碟——许多人不喜欢它,而且它确实并非没有问题——但它在为解析器提供目标类型方面做得很好。它也比静态 parse<X>(const std::string&) 更有优势如上所述,它允许链接和流式传输的原型(prototype)。有时这不是必需的,但在许多解析上下文中它是必不可少的,并且使用 operator>>实际上是一个很酷的语法。 [2]

标准库并没有做最酷的事情,那就是跳过字符串常量 scanf样式并允许交错阅读。

vector<int> integers;
std::cin >> "[" >> interleave(integers, ",") >> "]";

但是,这可以定义。 (可能在字符串文字周围使用显式包装器会更好,但实际上我更喜欢那样;但是如果您要传递一个变量,您会想要使用包装器)。


[1] 随着新auto声明,其原因就更加清楚了。

[2] 另一方面,IO 操纵器是一个残酷的笑话。错误处理是可悲的。但你不能拥有一切。

关于c++ - 使用模板实现通用字符串解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13827302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com