Is Boost.Tuple compatible with C++0x variadic templates?

前端 未结 1 1424
醉梦人生
醉梦人生 2021-01-02 23:52

I was playing around with variadic templates (gcc 4.5) and hit this problem :

template 
boost::tuple
my_make_tuple(Arg         


        
相关标签:
1条回答
  • 2021-01-03 00:05

    It doesn't seem to like expanding Args... to T1, T2, T3, ..., T9 as Boost has it.

    As a workaround, use constructs that don't require this expansion:

    #include <boost/tuple/tuple.hpp>
    
    template <typename... Args>
    auto my_make_tuple(Args... args) -> decltype(boost::make_tuple(args...))
    {
       return {args...};
    }
    
    int main (void)
    {
        boost::tuple<int, char> t = my_make_tuple(8, 'c');
    }
    

    Another option might be to do the expanding manually, seeing that boost::tuple supports up to 10 arguments.

    #include <boost/tuple/tuple.hpp>
    
    template <unsigned, class, class...> struct nth_argument;
    
    template <unsigned N, class Default, class T, class... Args>
    struct nth_argument<N, Default, T, Args...>
    {
        typedef typename nth_argument<N - 1, Default, Args...>::type type;
    };
    
    template <class Default, class T, class... Args>
    struct nth_argument<0, Default, T, Args...>
    {
        typedef T type;
    };
    
    template <unsigned N, class Default>
    struct nth_argument<N, Default>
    {
        typedef Default type;
    };
    
    template <typename ...Args>
    struct tuple_from_var_template
    {
        typedef boost::tuple<
            typename nth_argument<0, boost::tuples::null_type, Args...>::type,
            typename nth_argument<1, boost::tuples::null_type, Args...>::type,
            typename nth_argument<2, boost::tuples::null_type, Args...>::type,
            typename nth_argument<3, boost::tuples::null_type, Args...>::type,
            typename nth_argument<4, boost::tuples::null_type, Args...>::type,
            typename nth_argument<5, boost::tuples::null_type, Args...>::type,
            typename nth_argument<6, boost::tuples::null_type, Args...>::type,
            typename nth_argument<7, boost::tuples::null_type, Args...>::type,
            typename nth_argument<8, boost::tuples::null_type, Args...>::type,
            typename nth_argument<9, boost::tuples::null_type, Args...>::type
        > type;
    };
    
    template <typename... Args>
    typename tuple_from_var_template<Args...>::type my_make_tuple(Args... args)
    {
       return typename tuple_from_var_template<Args...>::type(args...);
    }
    
    int main (void)
    {
        boost::tuple<int, char> t = my_make_tuple(8, 'c');
    }
    
    0 讨论(0)
提交回复
热议问题