所以我在C ++ 11之前编写了一些基于模板参数解析字符串的代码。我没有为每个参数数量设置一个定义,而是想使用可变参数模板,但我不能完全理解如何正确初始化元组。请参阅这个我想要的简化代码,这是针对2个参数的特殊情况:
template <typename Arg1, typename Arg2>
struct parser
{
static tuple<Arg1, Arg2> parse(const string& str)
{
Arg1 arg1;
Arg2 arg2;
// do the parsing with for example stringstream
return tuple<Arg1, Arg2>(arg1, arg2);
}
};
我在将参数放入可变参数的元组中时遇到问题。我可以用以下方法构造返回值持有者:
tuple<Args...> retVal;
但我不知道是否有办法迭代参数并将它们放在元组中。我已经看到了一些递归法术来获得printf
函数,但我不知道它是否适用于这种情况。
答案 0 :(得分:19)
您不需要助手类。用功能代替。
template <typename T> std::tuple<T> parse(std::istream& is)
{
T t; is >> t;
return std::tuple<T>(std::move(t));
}
template <typename T, typename Arg, typename... Args>
std::tuple<T, Arg, Args...> parse(std::istream& is)
{
T t; is >> t;
return std::tuple_cat(std::tuple<T>(std::move(t)),
parse<Arg, Args...>(is));
}
template <typename... Args>
std::tuple<Args...> parse(const std::string& str)
{
std::istringstream is(str);
return parse<Args...>(is);
}
编辑:今天,我想到了如何使用扩展以非常简单的方式完成这项工作:
template <typename T> T read(std::istream& is)
{
T t; is >> t; return t;
}
template <typename... Args>
std::tuple<Args...> parse(std::istream& is)
{
return std::make_tuple(read<Args>(is)...);
}
template <typename... Args>
std::tuple<Args...> parse(const std::string& str)
{
std::istringstream is(str);
return parse<Args...>(is);
}