move TupleElementBase out of namespace detail (meant to be overloaded)
parent
cd6e2a96aa
commit
4a871db249
|
@ -79,12 +79,10 @@ struct Array {
|
|||
template<typename T, Size N>
|
||||
struct TupleSize<Array<T, N>>: IntegralConstant<Size, N> {};
|
||||
|
||||
namespace detail {
|
||||
template<Size I, typename T, Size N>
|
||||
struct TupleElementBase<I, Array<T, N>> {
|
||||
using Type = T;
|
||||
};
|
||||
}
|
||||
|
||||
template<Size I, typename T, Size N>
|
||||
TupleElement<I, Array<T, N>> &get(Array<T, N> &a) {
|
||||
|
|
|
@ -26,7 +26,6 @@ template<typename T> struct TupleSize<const volatile T>: public TupleSize<T> {};
|
|||
|
||||
/* tuple element */
|
||||
|
||||
namespace detail {
|
||||
template<Size I, typename T> struct TupleElementBase;
|
||||
template<Size I, typename T>
|
||||
struct TupleElementBase<I, const T> {
|
||||
|
@ -40,10 +39,9 @@ namespace detail {
|
|||
struct TupleElementBase<I, const volatile T> {
|
||||
using Type = AddCv<typename TupleElementBase<I, T>::Type>;
|
||||
};
|
||||
}
|
||||
|
||||
template<Size I, typename T>
|
||||
using TupleElement = typename detail::TupleElementBase<I, T>::Type;
|
||||
using TupleElement = typename TupleElementBase<I, T>::Type;
|
||||
|
||||
/* is tuple-like */
|
||||
|
||||
|
@ -123,25 +121,26 @@ namespace detail {
|
|||
|
||||
namespace detail {
|
||||
template<typename ...T> struct TupleTypes {};
|
||||
}
|
||||
|
||||
template<Size I> struct TupleElementBase<I, TupleTypes<>> {
|
||||
template<Size I> struct TupleElementBase<I, detail::TupleTypes<>> {
|
||||
public:
|
||||
static_assert(I == 0, "TupleElement index out of range");
|
||||
static_assert(I != 0, "TupleElement index out of range");
|
||||
};
|
||||
|
||||
template<typename H, typename ...T>
|
||||
struct TupleElementBase<0, TupleTypes<H, T...>> {
|
||||
struct TupleElementBase<0, detail::TupleTypes<H, T...>> {
|
||||
public:
|
||||
using Type = H;
|
||||
};
|
||||
|
||||
template<Size I, typename H, typename ...T>
|
||||
struct TupleElementBase<I, TupleTypes<H, T...>> {
|
||||
struct TupleElementBase<I, detail::TupleTypes<H, T...>> {
|
||||
public:
|
||||
using Type = typename TupleElementBase<I - 1, TupleTypes<T...>>::Type;
|
||||
using Type = typename TupleElementBase<I - 1,
|
||||
detail::TupleTypes<T...>>::Type;
|
||||
};
|
||||
}
|
||||
|
||||
template<typename ...T> struct TupleSize<detail::TupleTypes<T...>>:
|
||||
IntegralConstant<Size, sizeof...(T)> {};
|
||||
|
|
|
@ -22,12 +22,10 @@ template<typename ...T> struct TupleSize<Tuple<T...>>:
|
|||
|
||||
/* tuple element */
|
||||
|
||||
namespace detail {
|
||||
template<Size I, typename ...T>
|
||||
struct TupleElementBase<I, Tuple<T...>> {
|
||||
using Type = typename TupleElementBase<I, TupleTypes<T...>>::Type;
|
||||
using Type = typename TupleElementBase<I, detail::TupleTypes<T...>>::Type;
|
||||
};
|
||||
}
|
||||
|
||||
/* tuple leaf */
|
||||
|
||||
|
|
|
@ -170,7 +170,6 @@ Pair<typename detail::MakePairRet<T>::Type,
|
|||
template<typename T, typename U>
|
||||
struct TupleSize<Pair<T, U>>: IntegralConstant<Size, 2> {};
|
||||
|
||||
namespace detail {
|
||||
template<typename T, typename U>
|
||||
struct TupleElementBase<0, Pair<T, U>> {
|
||||
using Type = T;
|
||||
|
@ -181,6 +180,7 @@ namespace detail {
|
|||
using Type = U;
|
||||
};
|
||||
|
||||
namespace detail {
|
||||
template<Size> struct GetPair;
|
||||
|
||||
template<> struct GetPair<0> {
|
||||
|
|
Loading…
Reference in New Issue