Hi, all.

boost::tuple provide a member template function get to gain a element of tuple, As following:

#include "boost\tuple\tuple.hpp"
using namespace boost;

template<typename T>
class TA{public:
    template<typename T1, typename T2>
    void testfun(T1 e1, T2 e2)
    {
        tuple<T1, T2> t1(e1, e2);
        //T1 _e1 = t1.template get<0>(); //works
        T1 _e1 = t1.get<0>();   //works for boost::tuple
/*
However, according c++98, t1.get<0>() seems to should be encounter a compilor error.
I want to known how boost::tuple avoid this compile error.
*/
    }
};


int main()
{
    int i=10;
    float f=10.5f;
   
    TA<char> obj;
    obj.testfun(i, f);
   
    return 0;
}

The above sample pass the compilation of gcc3.4.2 and gcc 4.2.4.
 

According to boost::tuple, I implement a new tuple by myself. as following:
(In fact, the following code is mostly extracted from boost::tuple. )

namespace testNS{
template<int N, class T>
struct element
{
private:
  typedef typename T::tail_type Next;
public:
  typedef typename element<N-1, Next>::type type;
};

template<class T>
struct element<0,T>
{
  typedef typename T::head_type type;
};

struct null_type{};

template<typename HT, typename TT>
struct cons
{
  typedef HT head_type;
  typedef TT tail_type;

  template <int N>
  typename element<N, cons<HT, TT> >::type
  get() {
    typedef typename element<N, cons<HT, TT> >::type  RetType;
    return RetType();
  }
};

template<typename HT>
struct cons<HT, null_type>
{
  typedef HT head_type;
  typedef null_type tail_type;
  typedef cons<HT, null_type>  self_type;
  //get(BOOST_EXPLICIT_TEMPLATE_NON_TYPE(int, N))
  template <int N>
  typename element<N, self_type>::type
  get() {
    typedef typename element<N, cons<HT,null_type> >::type  RetType;
    return RetType();
    //return boost::tuples::get<N>(*this);
  }
};

template <class T0, class T1, class T2>
struct map_tuple_to_cons
{
  typedef cons<T0,
               typename map_tuple_to_cons<T1, T2, null_type>::type
              > type;
};

// The empty tuple is a null_type
template <>
struct map_tuple_to_cons<null_type, null_type, null_type>
{
  typedef null_type type;
};


template<typename T0, typename T1, typename T2=null_type>
class Tuple;


template<typename T0, typename T1, typename T2>
class Tuple: public map_tuple_to_cons<T0, T1, T2>::type
{
public:
    typedef T0 E0T;
    typedef T1 E1T;
    typedef T2 E2T;
   
    Tuple(const E0T& e0, const E1T& e1)
    {  }   
};

}//endof testNS

using namespace testNS;

template<typename T>
class TA{public:
    template<typename T1, typename T2>
    void testfun(T1 e1, T2 e2)
    {
        Tuple<T1, T2> t1(e1, e2);
        //T1 _e1 = t1.template get<0>(); //works
        T1 _e1 = t1.get<0>(); //encounter compilor error
/*
the gcc3.4.2 error message:
        syntax error before `;' token

the gcc4.2.4 error message:
error: expected primary-expression before ')' token
error: invalid operands of types '<unresolved overloaded function type>' and 'int' to binary 'operator<'
*/

    }
};


int main()
{
    int i=10;
    float f=10.5f;
   
    TA<char> obj;
    obj.testfun(i, f);
   
    return 0;
}


By the way, how can i get contact with boost::tuple author.?



--
miss you!