如何从对象中获取对元组尾部的引用 std::tuple<Head,Tail...>



我已经定义了:

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

我有函数 head()、tail() 和其他函数用于类 elem,但它们创建副本,它们返回元组头或元组尾部的副本,但我需要引用 this->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; }
};

但事实并非如此 - 你所知道的是你有类型ABC的子对象。它们的布局是完全未指定的 - 你绝对不知道实现是否使用这样的递归来实现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);
}
};

但是如果你真的想要这种类似递归的con-cell方法,你最好实际实现你自己的递归,这样你就可以得到想要的行为:

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

取决于你实际在做什么。

相关内容

最新更新