gpt4 book ai didi

c++ - 如何递归元组?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:46 26 4
gpt4 key购买 nike

我正在尝试制作一个可变参数模板容器,用于存储元素 vector 的元组。这个容器的要点是所有 vector 中的元素都是相关的,我想在以后保持这种相关性,但这不是计算所必需的。想象一下,如果你愿意的话,一个 vector_3 和一个某种类型的 ref_id。

容器只会一起统一变异 vector 。所以我理解的部分看起来像这样:

template<typename ...Elems>
class container
{
std::tuple<std::vector<Elems>...> data_;

public:
template<typename I>
const typename std::tuple_element<I, data_type>::type &nth_index() const
{ return std::get<I>(data_); }
};

我正在努力使用插入方法。我在想一些事情:

void push_back(std::tuple<Elems...> &values)
{
std::tuple<std::back_insert_iterator<std::vector<Elems>>...> inserters;
}

但我不知道如何初始化这个“插入器”元组。我一直在 stackoverflow 上查看各种递归模板示例,但我无法将其全部记在脑海中足够长的时间来理解它。

我假设如果我有这样一个元组,我可以使用简单的赋值:

inserters = values;

我还想编写一个跨所有返回值元组的数组的访问器:

std::tuple<Elems &...> operator[](const size_t index)
{
...
}

但又一次,我不知道如何初始化这个元组。

我不可能是唯一一个想这样做的人,而且我找不到好的资源来学习它。与此同时,我正在尝试消化 0x 的原始可变参数模板提案。洞察力将不胜感激。我受 MSVC 2012 实现的限制。

最佳答案

#include <vector>
#include <tuple>
#include <cstddef>
#include <utility>

template <typename... Elems>
class container
{
using data_type = std::tuple<std::vector<Elems>...>;

data_type data_;

public:
template <std::size_t I>
const typename std::tuple_element<I, data_type>::type& nth_index() const
{ return std::get<I>(data_); }

void push_back(const std::tuple<Elems...>& values)
{
return push_back(std::make_index_sequence<sizeof...(Elems)>{}, values);
}

std::tuple<Elems&...> operator[](std::size_t index)
{
return get_elems(std::make_index_sequence<sizeof...(Elems)>{}, index);
}

private:
template <std::size_t... Is>
void push_back(std::index_sequence<Is...>, const std::tuple<Elems...>& values)
{
using expand = int[];
static_cast<void>(expand{ 0, (std::get<Is>(data_).push_back(std::get<Is>(values)), 0)... });
}

template <std::size_t... Is>
std::tuple<Elems&...> get_elems(std::index_sequence<Is...>, std::size_t index)
{
return std::forward_as_tuple(std::get<Is>(data_)[index]...);
}
};

DEMO

关于c++ - 如何递归元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35443480/

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