我想要解析字符串(使用給定的格式)的通用解決方案。例如,我想能夠解析包含數值列表(整數或浮點數)的字符串並返回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 ::可選。理想情況下,我想有隻是一個單一的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
函數推導模板值。我不確定如何解決這個問題(甚至是否可以修復它,因爲設計方法可能完全有缺陷)。有沒有人知道一種方法來解決我想要做的事情?如果您能指出我解決我目前實施中遇到的問題的可能方法,我將非常感激。順便說一句,我對於解決這個問題的觀點也完全不同。
調用類型爲「parse_value」的I.e'parse_value(str)' –
Nim
@Nim當我直接調用'parse_value'解析一個整數向量時,但是我不能從'parse_optional_value'做到這一點。至少我看不到如何...... – betabandido
是否有一個原因是你避免了現有的解析器庫,例如[Boost.Spirit](http://www.boost.org/libs/spirit/)? – ildjarn