Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2011, 16:04   #1
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию Списки типов. TypeAt.

Списки типов подсмотрены в Александреску еще очень-очень давно. Но сейчас книги не имеется, а с гуглом по этому вопросу я как-то не слишком подружился.

Ниже сама реализация списка типов и реализация шаблона TypeAt, который у меня почему-то именуется AtIndex, потом исправлю . Вот она как раз у меня пахать и не хочет. В чем ошибка, я уже третий день понять не могу. Пытался и так и эдак ее переписать, но работать она отказывается.

Возможно, кто-нибудь подскажет мне в чем проблема?


Код:
class NullType
{
};

template<class T, class U>
struct TypeList
{
    typedef T Head;
    typedef U Tail;
};

template<class TList>
struct Length;

template <>
struct Length<NullType>
{
    enum
    {
        value = 0
    };
};

template <class T, class U>
struct Length< TypeList<T,U> >
{
    enum
    {
        value = 1 + Length<U>::value
    };
};

template<class TList, unsigned int Index>
struct AtIndex;

template <class T, class U>
struct AtIndex< TypeList<T,U>, 0 >
{
    typedef T Result;
};

template <class T, class U, unsigned int Index>
struct AtIndex< TypeList<T,U>, Index >
{
    typedef AtIndex<U, Index-1>::Result Result;
};

#define TypeList_1(T1) TypeList< T1, NullType >
#define TypeList_2(T1,T2) TypeList< T1, TypeList_1(T2) >
mMAg вне форума Ответить с цитированием
Старый 21.05.2011, 17:25   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
template <class T, class U, unsigned int Index>
struct AtIndex< TypeList<T,U>, Index >
{
    typedef typename AtIndex<U, Index-1>::Result Result;
...
у меня так скомпилировалось с gcc и clang
netrino вне форума Ответить с цитированием
Старый 22.05.2011, 00:40   #3
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Спасибо. Я пробовал в таком варианте, но все равно напрочь отказывается компилироваться. Проблема в том, что он почему-то не воспринимает частичную специализацию и продолжает раскручивать рекурсию для индексов меньших 0. Хотя по сути не должен.
Кстати, под MVS 05 все скомпилировалось. Но вот борланд отказывается воспринимать частичную специализацию.
mMAg вне форума Ответить с цитированием
Старый 22.05.2011, 16:12   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А, ну борланд да, он может) Возможно есть возможность это обойти как-то, но я не в курсе, честно говоря)
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразование типов Танчик007 Общие вопросы C/C++ 0 03.05.2011 15:39
Преобразование типов FaTaL Общие вопросы .NET 5 07.03.2011 14:07
Преобразование типов ArtGoN Общие вопросы C/C++ 5 16.11.2010 19:35
Несовпадение типов ILOR Помощь студентам 5 26.11.2008 13:56