题
在 C++0x 中我想写一个这样的函数:
template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
//Put things into the tuple
}
我首先尝试使用 for 循环 int i
然后执行以下操作:
get<i>(my_tuple);
然后在结果中存储一些值。然而, get
仅适用于 constexpr
.
如果我能从变量中取出变量 tuple
并将它们传递给可变参数模板函数,我可以非常轻松地递归参数,但我不知道如何在不使用元组的情况下将变量从元组中取出 get
. 。关于如何做到这一点有什么想法吗?或者有人有其他方法可以修改这个 tuple
?
解决方案
由于“我”在
get<i>(tup)
需要是编译时常量,模板实例化用于“迭代”(实际上是递归)这些值。Boost 元组具有“长度”和“元素”元函数,这些元函数在这里会很有帮助——我假设 C++0x 也有这些。
其他提示
升压融合 值得一看。它可以“迭代” std::pair
, boost::tuple
, ,一些其他容器及其自己的元组类型,尽管我认为它不支持 std::tuple
然而。
AFAICT,C++元组基本上需要用递归来处理;似乎没有任何真正的方法来打包/拆包元组 除了 使用类型系统唯一的可变参数模板处理。
看一下 TR1 的 6.1.3.4 节, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
get 是为 const 和非 const 限定元组定义的,并返回适当的引用类型。如果将函数声明更改为以下内容:
template
void fun(typename std::tuple& my_tuple) {
//Put things into the tuple
}
然后,函数的参数是一个非常量元组,一旦您使用之前响应中提供的信息编写了迭代, get 将允许您进行必要的分配。
请查看我的答案,了解模板递归将元组参数展开到函数调用的示例。
不隶属于 StackOverflow