我想实现类似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;
}
};
我还实现了一个帮助程序struct 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);
}
但是我收到了一个错误:参数包没有用'...'扩展
我做错了什么?
答案 0 :(得分:0)
就是这样。我已经使用模板特化实现了它,但由于功能部分特化的残疾,我修改了上面的tuple_element结构。这就是我最终拥有的:
template<size_t I, class T>
struct TupleElement;
template<size_t I, class Head, class ... Rest>
struct TupleElement<I, Tuple<Head, Rest...> >:
public TupleElement<I - 1, Tuple<Rest...> > {
static typename TupleElement<I, Tuple<Head, Rest...> >::Type
Get(const Tuple<Head, Rest...>& t) {
return TupleElement<I - 1, Tuple<Rest...> >::Get(t.Tail());
}
};
template<class Head, class ... Rest>
struct TupleElement<0, Tuple<Head, Rest...> > {
typedef Head Type;
static typename TupleElement<0, Tuple<Head, Rest...> >::Type
Get(const Tuple<Head, Rest...>& t) {
return t.Head();
}
};
template<size_t Pos, class Head, class ... Rest>
typename TupleElement<Pos, Tuple<Head, Rest...> >::Type
Get(const Tuple<Head, Rest...>& t) {
return TupleElement<Pos, Tuple<Head, Rest...> >::Get(t);
}
谢谢大家的有用建议。