使用可变模板构建元组

build tuple using variadic templates

本文关键字:构建 元组      更新时间:2023-10-16

因此,我在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函数,但我不知道它是否适用于这种情况。

您不需要助手类。改为使用函数。

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);
}