| Jon Stewart on 22 Oct 2003 02:07:24 -0000 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| [ALACPP] emendation to previous bullshit spoken by yours truly |
When we were reading _Modern C++ Design_, I complained once or twice that
it was unfortunate that typelists necessitated template partial
specialization support.
This statement is indeed wrong. Notice:
template<class T, class U>
struct Typelist {
typedef T Head;
typedef U Tail;
};
class NullType {};
#define TYPELIST_1(T1) Typelist< T1, NullType >
#define TYPELIST_2(T1, T2) Typelist< T1, TYPELIST_1(T2) >
// etc.
The definition of a typelist does not involve template partial spec.
However, implementations of typelist "functions" are trickier. A simple
Length isn't bad:
template <class TList> struct Length;
template<> struct Length<NullType> {
enum { value = 0 };
};
template <class TList>
struct Length {
enum { value = 1 + Length<TList::Tail>::value };
};
but others can be considerably trickier (than their partial spec
counterparts):
template <class TList, unsigned int i>
struct TypeAt {
typedef typename _detail::calc_at<i>::template inner<TList>::Ret
Ret;
};
with:
namespace _detail {
template<uint index> struct calc_at;
template<>
struct calc_at<0> {
template <class TList>
struct inner {
typedef TList::Head Ret;
};
};
template<uint index>
struct calc_at {
template <class TList>
struct inner {
typedef typename calc_at<index-1>::template
inner<TList::Tail>::Ret Ret;
};
};
} // namespace _detail
Some may notice that I've basically ripped this off from boost::tuple.
But, hey, it works!
Jon
--
Jon Stewart Advanced Los Angeles C++
stew1@xxxxxxxxxxx http://www.alacpp.org
_______________________________________________
alacpp mailing list
alacpp@xxxxxxxxxxx
http://lists.ellipsis.cx/mailman/listinfo/alacpp