Я хочу реализовать что-то вроде std::get(std::tuple), имея класс кортежа:
template<typename ... Types> class Tuple;
template<> class Tuple<> {};
template<typename First, typename ... Rest>
class Tuple<First, Rest...>: private Tuple<Rest...> {
First Member;
public:
Tuple(const First& first, const Rest& ... rest):
Tuple<Rest...>(rest...), Member(first) {}
const First& Head() const {
return Member;
}
const Tuple<Rest...>& Tail() const {
return *this;
}
};
Я также реализовал вспомогательную структуру tuple_element.
template<size_t I, class T>
struct tuple_element;
template<size_t I, class Head, class ... Tail>
struct tuple_element<I, Tuple<Head, Tail...> >:
tuple_element<I - 1, Tuple<Tail...> > {};
template<class Head, class ... Tail>
struct tuple_element<0, Tuple<Head, Tail...> > {
typedef Head type;
};
Но я не могу понять, как реализовать функцию Get(Tuple). Я думаю, что я пробовал все. Моя последняя попытка:
template<class T, class Head, class ... Tail>
T Get(size_t pos, const Tuple<Head, Tail...>& t) {
if (pos > 0) {
return Get<T>(pos - 1, t.Tail());
}
return t.Head();
}
template<size_t Pos, class Head, class ... Tail>
typename tuple_element<Pos, Tuple<Head, Tail...> >::type
Get(const Tuple<Head, Tail...>& t) {
return Get<typename tuple_element<Pos, Tuple<Head, Tail...> >::type>(Pos, t);
}
Но я получил ошибку: пакеты параметров не расширены с помощью «...»
Что я делаю не так?
Get<T>(pos - 1, t.Tail());
-Tail
здесь тип, который не сработает. - person 0x499602D2   schedule 07.04.2013enable_if
, либо специализации шаблона. Первая функцияGet
возвращает либоT
, либоHead
в зависимости от условия выполнения — это невозможно. - person mfontanini   schedule 07.04.2013