我正在尝试提出一个用于解析字符串(具有给定格式)的通用解决方案。例如,我希望能够解析包含数值列表(整数或浮点数)的字符串并返回 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
函数可以委托相应的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
函数的返回类型推断模板值。我不确定如何解决这个问题(或者甚至不确定是否可以解决它,因为设计方法可能完全有缺陷)。有谁知道解决我想要做的事情的方法?如果您能指出一种可能的方法来解决我在当前实施中遇到的问题,我将不胜感激。顺便说一句,我也绝对愿意接受完全不同的想法来解决这个问题。