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

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

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

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

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

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

Добрый день, уважаемые форумчане.

Появился у меня новый вопросик. Кто-нибудь встречал список из элементов разного типа? (Вариант не предлагать, не катит, нужна именно шаблонная реализация.)Или, возможно, может дать какие-то рекомендации по реализации. Наработки выкладывать не буду, поскольку выкладывать некомпилирующийся код это не есть хорошо, я считаю. Если появится что-то близкое к тому, что мне нужно, обязательно выложу.

Заранее спасибо за помощь.

З.Ы. с++, разделом не ошибся )
mMAg вне форума Ответить с цитированием
Старый 27.05.2011, 18:23   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Можно на массиве void*'ов, что-то типа:
Код:
class IndifList
{
private:
   list<void*> data;

public:
   template <typename T>
   IndifList& operator += (T &obj)
   {
      data.push_back(reinterpret_cast<void*>(new T(obj)));
      return *this;
   }

   template <typename T>
   const T& Back() const
   {
       return *reinterpret_cast<T*>(data.back());
   }
};
И про деструктор не забудьте.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 27.05.2011, 19:10   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

Вариант - унаследовать все нужные типы от одного базового класса не устраивает?
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 27.05.2011, 19:40   #4
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Цитата:
Сообщение от Blade Посмотреть сообщение
Вариант - унаследовать все нужные типы от одного базового класса не устраивает?
Нет, к сожалению.

Пишу сейчас код по void*, если все заработает, тогда будет просто шикарно.
mMAg вне форума Ответить с цитированием
Старый 27.05.2011, 20:10   #5
mMAg
Форумчанин
 
Аватар для mMAg
 
Регистрация: 11.08.2009
Сообщений: 433
По умолчанию

Syuf, спасибо большое. Впервые на форуме мне действительно очень сильно помогли ))

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

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#include <iostream.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#ifndef TypeListH
#define TypeListH
//---------------------------------------------------------------------------
#endif

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, int Index>
struct TypeAt;

template <class TList, int Index>
struct TypeAt
{
    typedef typename TypeAt<typename TList::Tail, Index - 1>::Result Result;
};

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

template< class TList >
class IndifList
{
private:
    void** data;
    int len;

public:

    IndifList()
    {
        int len = Length<TList>::value;
        data = new void*[len];
    }

    ~IndifList()
    {
        for (int i = 0; i < len; i++)
        {
            delete data[i];
        }
        delete[] data;
    }

    template<int Index>
    TypeAt<TList, Index>::Result & Get()
    {
        return *reinterpret_cast<TypeAt<TList, Index>::Result*>(data[Index]);
    }

    template<int Index>
    void Set( TypeAt<TList, Index>::Result & value )
    {
        data[Index] = reinterpret_cast<void*>(new TypeAt<TList, Index>::Result(value));
    }

};

#define TypeList_1(T1) TypeList< T1, NullType >
#define TypeList_2(T1,T2) TypeList< T1, TypeList_1(T2) >
#define TypeList_3(T1, T2, T3) TypeList< T1, TypeList_2(T2, T3) >


//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    IndifList<TypeList_3(int,float, AnsiString)> list;
    int i = 1;
    float b = 2.2;
    AnsiString s = "fdf";
    list.Set<0>(i);
    list.Set<1>(b);
    list.Set<2>(s);
    cout << list.Get<0>() << " " << list.Get<1>() << " " << list.Get<2>().c_str() << endl;
    system("pause");
    return 0;
}
//---------------------------------------------------------------------------

Последний раз редактировалось mMAg; 27.05.2011 в 20:48.
mMAg вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Множество элементов пользовательского типа WarHamster Паскаль, Turbo Pascal, PascalABC.NET 2 26.12.2010 11:52
[C++]Односвязной список типа дек Zimmo Помощь студентам 0 30.05.2010 13:02
вывод элементов из массивов смешанного типа kirosin PHP 2 17.01.2010 17:04
функция malloc() для разного типа переменной. Serjuk Помощь студентам 46 05.01.2010 21:52
массив элементов типа класс на C# byte916 Помощь студентам 2 09.12.2009 14:14