Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Enum не вычисляется...


Автор: Chaos A.D. 9.3.2006, 11:33
Сегодня утром решил поимпровизировать на тему создания вариантного (Variant) типа. Ну тот, который в boost::variant или как там его (boost::any?)... И встрял в самом начале - по таинственным причинам компилер (BCB6 smile) отказывается компилить...

Код


// Ищем самый большой размер в списке типов TList... (нужно знание Loki)

template <class TList>
struct MaxSizeof;

template <class T, class U>
struct MaxSizeof< Loki::Typelist<T, U> >
{
    enum { result = ( sizeof(T) > MaxSizeof<U>::result ) ? sizeof(T) : MaxSizeof<U>::result };
};

template <class T>
struct MaxSizeof< Loki::Typelist<T, Loki::NullType> >
{
    enum { result = sizeof(T) };
};



// Дальше сам Variant

template <class TList>
class Variant
{
        enum { max_sizeof_tlist = MaxSizeof<TList>::result };
        boost::aligned_storage< max_sizeof_tlist > storage_;

        // Всё остальное не важно...
};



Ну почему же мой компилер нормально компилит код, в котором я тестирую MaxSizeof, но никак не хочет инстанцировать aligned_storage? Он за каким-то хреном пытается это сделать с параметром 0! Почему?

Автор: MAKCim 9.3.2006, 19:03
даже не знаю
попробуй другим компилятором
в любом случае MaxSizeof не должен 0 возвращать, потому как нет типа с нулевым размером, как минимум 1 байт

Автор: Chaos A.D. 10.3.2006, 08:02
Другого компилятора с бустом и Loki нет под рукой. Может, ты попробуешь? Буду очень признателен, т.к. это для меня уже дело принципа...

Автор: MAKCim 10.3.2006, 09:27
Loki у меня нет но список типов нетрудно сделать самому, это у меня работает нормально
(gcc 4.0.2)
Код

#include <boost/aligned_storage.hpp>

namespace tl
{
    template<class _P1, class _P2> struct type_list
    {
        typedef _P1 head;
        typedef _P2 tail;
    }
   
    struct null_type {};

    template<class _List> struct max_sizeof;
    template<class _Ht, class _Tt> struct max_sizeof<type_list<_Ht,_Tt> >
    {
        enum {__value=sizeof(_Ht)>max_sizeof<_Tt>::__value ? sizeof(_Ht): max_sizeof(_Tt)};
    }
    
    template<class _Ht> struct max_sizeof<type_list<_Ht,null_type> > {enum {__value=sizeof(_Ht)};};
    template<> struct max_sizeof<null_type> {enum {__value=0};};
}

using tl::null_type;
using tl::type_list;
using tl::max_sizeof;

template<class _List> class variant
{
private:
    boost::aligned_storage<max_sizeof<_List> > __storage;
};

typedef type_list<int, type_list<float, type_list<double, null_type>>> _List;

int main()
{
    variant<_List> w;
    return 0;
}

Автор: Chaos A.D. 10.3.2006, 15:25
Хм, значит, дело в моём компилере...smile Спасибо за помощь.

Автор: chipset 11.3.2006, 02:37
Ух, выбрось ты эту гадость.

Автор: MAKCim 11.3.2006, 11:15
Цитата

Ух, выбрось ты эту гадость.

в смысле? smile

Автор: Chaos A.D. 12.3.2006, 12:25
О компилере, наверное.

Автор: MAKCim 12.3.2006, 12:26
Цитата

О компилере, наверное.

если о нем, согласен smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)