[Haskell-cafe] Re: Datatypes - Haskell

ajb at spamcop.net ajb at spamcop.net
Sun Feb 10 17:45:22 EST 2008


G'day all.

On Feb 10, 2008 3:40 PM, Mattes Simeon <simeon.mattes at gmail.com> wrote:

>> Though in comparison with C or C++ I can't figure out so clear the syntax.

Quoting Victor Nazarov <asviraspossible at gmail.com>:

> I think this is the most native way to do it in C++:

Herb Sutter and Andrei Alexandrescu will find you and beat you up if
you write this.  This is considered more appropriate.  (Warning: untested
code follows.)

#include <boost/variant.hpp>

template<typename A, typename B>
class Tuple : public boost::variant<A, std::pair<A,B> >
{
private:
     typedef std::pair<A,B> pair_type;
     typedef boost::variant<A, pair_type> base_type;

     struct visitor_A : public boost::static_visitor<const A*>
     {
         const A* operator()(const A& a) { return &a; }
         const A* operator()(const pair_type& p) { return &p.first; }
     };

public:

     Tuple(const A& a)
         : base_type(a)
     {
     }

     Tuple(const A& a, const B& b)
         : base_type(pair_type(a,b))
     {
     }

     const A* tuple1() const
     {
         return boost::apply_visitor(visitor_A(), *this);
     }

     const B* tuple2() const
     {
         const pair_type* p = boost::get<pair_type>(*this);
         return p ? &p->second : 0;
     }
};

But in this specific case, this might be more appropriate:

template<typename A,typename B>
class Tuple
{
     A m_a;
     boost::optional<B> m_b;
     // etc
};

Cheers,
Andrew Bromage


More information about the Haskell-Cafe mailing list