Невозможно привязать значение l к следующей ссылке - PullRequest
0 голосов
/ 06 июня 2018

У меня есть шаблонный класс, который содержит n чисел T, использующих параметры шаблонов с переменными числами и рекурсивное наследование.Это скорее похоже на Tuple, и вот как я назвал его здесь:

template<class T, size_t tupleSize>
class MyTuple : private MyTuple<T, tupleSize - 1> {
private:
    T t;
public:
    MyTuple(std::string name)
            : t(name),
              MyTuple<T, tupleSize - 1>(name) {}
};

template<class T>
class MyTuple<T, 0> {
public:
    MyTuple(std::string name) {}
};

Я сейчас пытаюсь создать класс CompositeTuple, который позволяет объединять несколько объектов MyTuple.Это предназначено для хранения экземпляров объекта MyTuple или ссылок на объекты MyTuple. Предполагается, что использование будет выглядеть примерно так:

struct A {
    A(std::string s) {}
};

int main() {
    MyTuple<A, 3> a("hello");

    CreateCompositeTuple(a, MyTuple<A, 1>("world"));

    return 0;
}

К сожалению, моя текущая реализация CompositeTuple отстает от отметки:

template<class ...T>
class CompositeTuple;

template<>
class CompositeTuple<> {
};

template<template<class T, size_t tupleSize> class TupleType, size_t tupleSize, class T, class ...TupleTypes>
class CompositeTuple<TupleType<T, tupleSize>, TupleTypes...>
        : private CompositeTuple<TupleTypes...> {
private:
    const TupleType<T, tupleSize> tuple;
public:
    CompositeTuple(TupleType<T, tupleSize> &&tuple, TupleTypes &&...tuples)
            : CompositeTuple<TupleTypes...>(tuples...),
              tuple(std::forward<TupleType<T, tupleSize>>(tuple)) {}
};



template<template<class T, size_t tupleSize> class ...TupleType, size_t ...tupleSize, class ...T>
auto CreateCompositeTuple(TupleType<T, tupleSize> &&...tuples) {
    return CompositeTuple<TupleType<T, tupleSize>...>(std::forward<TupleType<T, tupleSize>...>(tuples...));
}

При вызове CreateCompositeTuple генерируется следующая ошибка компилятора: error: cannot bind 'MyTuple' lvalue to 'MyTuple&&'

Что я здесь не так делаю?Хотя я не смог решить проблему, очевидно, что все прочитанные мною работы предполагают, что это должно быть возможно.

Редактировать: Мне нужны дополнительные методы в CompositeTupleкоторый имеет доступ к аргументам шаблона T и tupleSize.Примерно так:

template<size_t index, typename std::enable_if<index < tupleSize>::type * = nullptr>
constexpr const T &At() const {
    return tuple.At<index>();
}

Редактировать 2: Попытка добавить шаблонного конструктора в соответствии с предложением Игоря:

// ...
template<template<class T, size_t tupleSize> class TupleType, size_t tupleSize, class T, class ...TupleTypes>
class CompositeTuple<TupleType<T, tupleSize>, TupleTypes...>
        : private CompositeTuple<TupleTypes...> {
private:
    const TupleType<T, tupleSize> tuple;
public:        
    template<class TT, class ...TTs>
    CompositeTuple(TT &&tuple, TTs &&...tuples)
        : CompositeTuple<TTs...>(tuples...),
          tuple(std::forward<TT>(tuple)) {}
};

template<class ...TupleType>
auto CreateCompositeTuple(TupleType &&...tuples) {
    return CompositeTuple<TupleType...>(std::forward<TupleType>(tuples)...);
}
//...

У меня теперь есть "недействительный"использование неполного типа "ошибка внутри функции CreateCompositeTuple.

...