在C ++中,你有一个修改变长元组的函数吗?

时间:2008-09-17 05:44:55

标签: c++ tuples

在C ++ 0x中我想写一个这样的函数:

template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
    //Put things into the tuple
}

我首先尝试在int i上使用for循环,然后执行:

get<i>(my_tuple);

然后在结果中存储一些值。但是,get仅适用于constexpr

如果我可以从tuple中取出变量并将它们传递给可变参数模板化函数,我可以非常容易地通过参数递归,但我不知道如何在没有{的情况下从变量中获取变量{1}}。有关如何做到这一点的任何想法?或者是否有人有另一种方法来修改此get

5 个答案:

答案 0 :(得分:4)

in

get<i>(tup)

需要是编译时常量,模板实例化用于通过值“迭代”(实际递归)。 Boost元组具有“长度”和“元素”元函数,这在这里很有用 - 我假设C ++ 0x也有这些。

答案 1 :(得分:3)

Boost.Fusion值得一看。它可以“迭代”std::pairboost::tuple,其他一些容器及其自己的元组类型,但我认为它还不支持std::tuple

答案 2 :(得分:0)

看看TR1的第6.1.3.4节,http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

为const和非const限定元组定义get并返回适当的引用类型。如果将函数声明更改为以下内容:

template 
void fun(typename std::tuple& my_tuple) {
    //Put things into the tuple
}

然后你的函数的参数是一个非常量元组,并且在你使用先前响应中提供的信息编写迭代后,get将允许你进行必要的赋值。

答案 3 :(得分:0)

AFAICT,C ++元组基本上需要用递归来处理;似乎没有任何真正的方法来打包/解包元组除了使用类型系统唯一的可变参数模板处理。

答案 4 :(得分:0)

在这里查看我的答案,获取模板递归的示例,以解开函数调用的元组参数。

How do I expand a tuple into variadic template function's arguments?