On Saturday, January 11, 2003, at 01:17 PM, David B. Held wrote:
Well then here's a little toy container that switches between heap-based and stack-based depending upon the fixed size length. Maybe has enough guts to spark interest, but not so much that it is too big to take in at a glance?"Howard Hinnant" <[EMAIL PROTECTED]> wrote in message [EMAIL PROTECTED]">news:[EMAIL PROTECTED]...[...]The fact that the concept is familiar to you already works in its favor,
Despite the fact that I suggested it, I don't find it a killer example.
;-)
I already code stuff like this, with this other pattern:
[...]
just as the familiarity of "Hello, world" is its primary feature. It
provides an entry point for people not necessarily exposed to
metaprogramming. Just seeing PTS spelled as "mpl::if_" might
produce an "Aha!" in people checking out MPL, just like Hello,
World does for a new language.
template <class T, unsigned int N>
class stack_based
{
protected:
static unsigned int const size = N;
T data_[N];
stack_based() {}
private:
stack_based(const stack_based& x);
};
template <class T, unsigned int N>
class heap_based
{
protected:
static unsigned int const size = N;
T* data_;
heap_based() : data_(new T[size]){}
~heap_based() {delete [] data_;}
heap_based& operator=(const heap_based& x)
{std::copy(x.data_, x.data_ + size, data_); return *this;}
private:
heap_based(const heap_based& x);
};
template <class T, unsigned int N = 10>
class MyContainer
: private if_<N <= 10, stack_based<T, N>, heap_based<T, N> >::type
{
typedef typename if_<N <= 10, stack_based<T, N>, heap_based<T, N> >::type base;
public:
using base::size;
// construct
MyContainer() {}
MyContainer(const MyContainer& x)
{std::copy(x.data_, x.data_ + size, base::data_);}
T& operator[](unsigned int i) {return base::data_[i];}
const T& operator[](unsigned int i) const {return base::data_[i];}
typedef T* iterator;
typedef const T* const_iterator;
iterator begin() {return base::data_;}
iterator end() {return base::data_ + size;}
const_iterator begin() const {return base::data_;}
const_iterator end() const {return base::data_ + size;}
};
-Howard
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost