Hansi | 21 May 08:42

Re: tuple type question


Noah Roberts schrieb:
> Hansi wrote:
>> Hello,
>>
>> at the moment I want to make a getter function for a tuple type. The 
>> tuple is internally hidden in a class. For that I want to make a 
>> function which returns the values inside the tuple. The best solution 
>> would be if I can make a enum which defines the position inside the 
>> tuple and a template function which returns the value for this tuple.
>>
>> I have tested the following, but it doesn't work:
>>
>> typedef struct Members
>> 		{
>> 			enum Member
>> 			{
>> 				name = 0,
>> 				value = 1,
>> 			};
>> 		}Members;
>>
>> 		template<enum Member member>
>> 		element<0, Properties::Property>::type name()(const 
>> boost::tuples::tuple<std::wstring, boost::any>& prop)
>> 		{
>> 			return boost::tuples::get<member>(prop);
>> 		}
> 
> I didn't quite understand your goals here so I implemented both I 
> thought you could mean:
> 
> 
> #include <boost/tuple/tuple.hpp>
> #include <string>
> #include <iostream>
> 
> template < typename T1, typename T2 >
> struct Test
> {
>    typedef boost::tuple<T1,T2> tuple_t;
>    tuple_t tup;
> 
>    enum Members { NAME, VALUE };
> 
>    typename boost::tuples::element<NAME, tuple_t>::type name() { return 
> tup.get<NAME>(); }

this version doesn't work with my compiler (msvc8.0). I get the error:

error C2899:typename cannot be used outside a template declaration

But this would be the preferred version for me. Have you an idea how I 
can solve this?

Best regards
Hansjörg

> 
>    template < Members mem >
>    typename boost::tuples::element<mem, tuple_t>::type member() { return 
> tup.get<mem>(); }
> };
> 
> int main()
> {
>    Test<std::string, int> t;
>    t.tup = Test<std::string,int>::tuple_t("Test", 42);
> 
>    std::cout << t.name() << std::endl;
>    std::cout << t.member<Test<std::string,int>::VALUE>() << std::endl;
> 
>    std::cin.get();
> }
> 
> Get the metaprogramming book by Abrahams and Gurtovoy.  It's completely 
> necessary to understand metaprogramming to be able to use these aspects 
> of boost.

Gmane