Как получить ссылку на хвост кортежа из объекта std :: tuple - PullRequest
1 голос
/ 16 марта 2019

Я определил:

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

У меня есть функции head (), tail () и другие для класса elem, но они создают копии, они возвращают копию заголовка кортежа или хвоста кортежа, но мне нужна ссылка на хвост this-> дм.

Для головы легко, std::get<0>(this->dm) дай мне ссылку.

Возможно ли это для хвоста? Под хвостом я подразумеваю все элементы после первого.

1 Ответ

2 голосов
/ 16 марта 2019

Такая вещь была бы возможна только в том случае, если 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);
    }
};
<ч />

Но если вы действительно хотите этот рекурсивный подход, похожий на соты, вам, вероятно, лучше реализовать собственную рекурсию, чтобы получить желаемое поведение:

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

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

Зависит от того, что вы на самом деле делаете.

...