gpt4 book ai didi

c++ - 如何从对象 std::tuple 获取对元组尾部的引用

转载 作者:行者123 更新时间:2023-11-30 03:17:47 28 4
gpt4 key购买 nike

我已经定义了:

template<class Head,class ...Tail>
struct elem{
std::tuple<Head,Tail...> dm;
};

我有类 elem 的函数 head()、tail() 和其他函数,但它们创建拷贝,它们返回元组头部或元组尾部的拷贝,但我需要对尾部的引用这个->DM。

对于头部很容易,std::get<0>(this->dm)给我引用。

尾部有可能吗?尾部是指第一个元素之后的所有元素。

最佳答案

只有 tuple<A, B, C> 才有可能发生这样的事情在内部存储为相当于 cons 单元的内容:

struct __tuple_A_B_C {
A car;
tuple<B, C> cdr;

A& head() { return car; }
tuple<B, C>& tail() { return cdr; }
};

但事实并非如此 - 你所知道的是你有类型为 A 的子对象, B , 和 C .它们的布局完全未指定 - 你绝对不知道实现是否使用这样的递归来实现 tuple .他们可以这样做,但我不确定是否有人这样做。

给定一个 tuple<A, B, C>,你能做的最好的事情就是返回 tuple<B&, C&> .在 C++17 中,实现起来还不错:

template<class Head,class ...Tail>
struct elem{
std::tuple<Head,Tail...> dm;

auto tail() {
return std::apply([](auto&, auto&... rest){
return std::tie(rest...);
}, dm);
}
};

但是,如果您真的想要这种类似于递归 cons-cell 的方法,那么您最好实际实现自己的递归,以便获得所需的行为:

template <class Head, class... Tail>
struct elem {
Head head;
elem<Tail...> tail;
};

template <class Head>
struct elem<Head> {
Head head;
};

取决于您实际在做什么。

关于c++ - 如何从对象 std::tuple<Head,Tail...> 获取对元组尾部的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55196669/

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