在C ++中,可以使用一个函数来修改可变长度的元组吗?

时间:2020-03-05 18:58:02  来源:igfitidea点击:

在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有效。

如果我可以从"元组"中获取变量并将它们传递给可变参数的模板化函数,我可以很容易地遍历参数,但是我不知道如何在没有" get"的情况下从元组中获取变量。关于如何做到这一点的任何想法?还是有人有另一种修改此"元组"的方法?

解决方案

回答

由于" i"在

get<i>(tup)

需要是一个编译时常量,模板实例用于通过值"迭代"(实际上是递归)。 Boost元组具有"长度"和"元素"元功能,在这里可能会有所帮助-我假设C ++ 0x也具有这些功能。

回答

Boost.Fusion值得一看。它可以在std :: pair,boost :: tuple,其他一些容器及其自己的tuple类型上进行"迭代",尽管我认为它尚不支持std :: tuple。

回答

看看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即可让我们进行必要的赋值。

回答

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

回答

请看一下我在这里的答案,以了解模板递归的示例,该递归将元组参数展开为函数调用。

如何将元组扩展为可变参数模板函数的参数?