Чтобы расширить ответ G.Samaras, вы имеете право сделать это:
typedef std::tuple<type0, type1, type2, type3, type4> MyTuple;
MyTuple myTuple;
type0 a = std::get<0>(myTuple);
type1 b = std::get<1>(myTuple); //...etc.
(редактировать: глупо меня ... как это получается, вы также можете этого сделать:
type0 a = std::get<type0>(myTuple);
type1 a = std::get<type1>(myTuple);
... оставляя остальную часть ответа на месте, как пример того, как НЕ считать вещи)
Итак, как вы связываете 0 с типом0 и так далее?Вы можете сделать это (проверялось, но должно работать):
class MyTupleWrapper
{
private:
template <typename T> class TypeOffset {};
template <> class TypeOffset<type0> { enum { value = 0; } };
template <> class TypeOffset<type1> { enum { value = 1; } };
template <> class TypeOffset<type2> { enum { value = 2; } };
template <> class TypeOffset<type3> { enum { value = 3; } };
template <> class TypeOffset<type4> { enum { value = 4; } };
// ...etc
public:
typedef std::tuple<type0, type1, type2, type3, type4> MyTupleType;
explicit MyTupleWrapper(const MyTupleType& type) : _type(type) {}
template <typename T>
const T& Get() { return std::get< TypeOffset<typename T>::value >(_type); }
private:
MyTupleType _type;
}
Чтобы разорвать эту конструкцию вниз, не заходя слишком много в реализации, то это:
а. У вас есть два инструмента - специализированный тип std::tuple<Type1, Type2, ...>
и std::get<integer>(tupleObject);
, чтобы получить от него определенные типы. Целочисленный параметр зависит от начального способа определения кортежа ... поэтому, если ваш номер равен 3, возвращаемое значение является третьим типом в вашем списке типов внутри этого кортежа (в нашем случае type3
)
b. Кортеж сам по себе поддерживает нормальное назначение ... так разрешено MyTupleType t; t = type1();
. Но вы не можете вызывать type1 a = t;
- это должно быть type1 a = std::get<1>(t);
, что глупо, потому что у вас может быть много типов кортежей, и вам не нужно будет помнить, какую позицию вы определили type1 в каждом типе.
c. Что делает эта оболочка (намеревается сделать?) - это способность сказать type1 a = t.Get<type1>();
с использованием перегрузки шаблонов для преобразования каждого типа в время компиляции в его смещение.
ошибка: имя неизвестного типа «Бар» с каратом, указывающее на тип «Бар» в файле заголовка. – MayNotBe
Проверьте обновленный ответ. Это то, что вы хотите? – gsamaras
Я просто сделал. Никогда не слышал о кортеже - сейчас проверьте его – MayNotBe