使用可变模板构建元组
build tuple using variadic templates
因此,我在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++:TypeDef使用元组
- Pybind11:将元组列表从Python传递到C++
- 重载元组索引运算符-C++
- 在C++中,如何通过几种类型从元组中选择多个元素
- 将fold表达式与std::一起用于两个元组
- std::ranges::elements_view,用于自定义类似元组的数据
- 将元组的向量转换/构造为堆
- 专用于 std 元组的模板,而无需用户执行remove_cvref
- 将元组的向量构造成堆
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 将元组类型扩展为可变参数模板?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 从函数的可变参数构建特定元组
- 在Windows元组上构建64位Python扩展:未声明的标识符
- 在函数呼叫时,请从异质初始化列表中构建元组
- 递归地构建元组
- 构建一组对象并将它们放入元组中
- 使用可变模板构建元组
- 元组不是按顺序构建的?
- 编译问题:使用元组构建Composite_Key可变模板类