Как я могу создать буст-кортеж, который зависит от его имени? - PullRequest
0 голосов
/ 12 января 2011

Я хотел бы создать кортеж типа, который зависит от имени этого типа.

Может быть, пример прояснит мою проблему:

//T would be boost::tuples::tuple<int, int, ...>
template <typename T>
T generate()
{
    typedef T GT;
    typedef boost::tuples::element<0,GT>::type tt0;
    typedef boost::tuples::element<1,GT>::type tt1;
    typedef boost::tuples::element<2,GT>::type tt2;
    if(tt3==null_type)
        return boost::tuples::make_tuple<tt0,tt1>(static_cast<tt0>(1), static_cast<tt1>(2));
    else
        return boost::tuples::make_tuple<tt0, tt1, tt2>(static_cast<tt0>(1), static_cast<tt1>(2), ...);
}

РЕДАКТИРОВАТЬ: я нашел хороший способ, шаблон рекурсии .Проблема решена.

1 Ответ

2 голосов
/ 12 января 2011
typedef typename oost::tuples::element<0,GT>::type tt0;

...

if(tt3==null_type) 

Вы не можете проверить типы, как это, используйте mpl::if_ вместо

        return boost::tuples::make_tuple<tt0,tt1>(static_cast<tt0>(1), static_cast<tt1>(2));
    else
        return boost::tuples::make_tuple<tt0, tt1, tt2>(static_cast<tt0>(1), static_cast<tt1>(2), ...);

Вы пытаетесь удалить null_type?Просто используйте boost::fusion::remove.

Вот еще одно решение:

template <typename T>
tuple<tt0,tt1> 
generate(typename enable_if<is_same<tt3, null_type> >::type* = 0) {
    typedef typename boost::tuples::element<0,T>::type tt0;
    typedef typename boost::tuples::element<1,T>::type tt1;
     return make_tuple(tt0(1), tt1(1));
}

аналогично для другого случая.

уведомление: boost::enable_if, boost::is_same

...