gpt4 book ai didi

c++ - 使用可变参数模板构建元组

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:47 24 4
gpt4 key购买 nike

所以我有一些在 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);
}

关于c++ - 使用可变参数模板构建元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014713/

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