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

时间:2019-03-16 12:16:58

标签: c++ tuples c++17

我已经定义:

result =  seasonal_decompose(self.series, model='additive',freq=frequency) 
residual = result.resid

对于类elem,我具有函数head(),tail()和其他函数,但是它们创建副本,它们返回元组的头部或元组的尾部的副本,但是我需要引用此-> dm。

因为头脑很容易,template<class Head,class ...Tail> struct elem{ std::tuple<Head,Tail...> dm; }; 给我参考。

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

1 个答案:

答案 0 :(得分:2)

只有当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);
    }
};

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

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

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

取决于您的实际工作。