crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

mezmay
  опции профиля:
сообщение 21.7.2009, 9:28
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


Проблема такая: хочу создать класс для обработки массивов чисел. Элементами могут быть вещественный или комплексный short, int, float, double. Программа должна работать примерно так: открываю файл, выбираю тип данных (например, комплексный float) и делаю необходимые преобразования массивов. Вопрос: как хранить прочитанный массив в классе? если например создать поле void *data и после открытия делать myObject.data = new scplx[n]; - то как передавать тип в методы? можно конечно создать enum types{ INT, FLOAT, ...} и в каждом методе делать switch (TYPE){ case INT: ..... case FLOAT: ...} но так слишком много case'ов придется везде вставлять. Есть ли какое-то нормальное решение этой проблемы?

вроде бы для подобных целей существуют шаблоны, но опять же - как задать шаблону тип во время выполения?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 19)
AD
  опции профиля:
сообщение 21.7.2009, 9:38
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


насколько я знаю, эту проблему можно решить ДАЖЕ на этапе компиляции, а не на этапе выполнения с помощью списков типов. Александреску подробно описывает эту штуку.
Посмотрите в интернете информацию о библиотеке Loki, где они реализованы. Возможно, подойдут. Она бесплатна для скачивания. Основная структура выглядит так:

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

Ну а остальное почитайте у Александреску, посмотрите исходники библиотеки. (Сам сегодня ее собрал - собралась без проблем, только список предупреждений - что нестрашно! :) )

Сообщение отредактировал AD - 21.7.2009, 10:15
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 21.7.2009, 10:02
Сообщение #3


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


AD скорее всего правильный путь тебе указал.

Цитата(mezmay @ 21.7.2009, 10:28) *
но так слишком много case'ов придется везде вставлять.

конкретно рассматривая эту проблему, могу предложить как вариант массивы указателей на функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mezmay
  опции профиля:
сообщение 21.7.2009, 13:46
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 272
Регистрация: 13.7.2009
Из: Ростов-на-Дону
Пользователь №: 904

Спасибо сказали: 16 раз(а)




Репутация:   1  


а что скажите о его книге: «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования» - хорошая?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 21.7.2009, 13:53
Сообщение #5


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


я думаю что да - хорошая, но зависит от уровня подготовки читателя.:)

П.С. вопрос касательно литературы обсуждается в другой ветке форума.
так что лучше писать туда, а то модератор ругаться будет. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.7.2009, 14:04
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(mezmay)
а что скажите о его книге: «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования» - хорошая?

Я сейчас ее читаю. Книга полезная, интересная, но читать немного сложновато. Говорят, что читать ее проще, если знаешь функциональные языки программирования.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
D_K
  опции профиля:
сообщение 21.7.2009, 15:20
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 20
Регистрация: 20.5.2009
Пользователь №: 761

Спасибо сказали: 3 раз(а)




Репутация:   1  


mezmay, а как собираешься использовать сие творение? Можно псевдокодом. От этого многое зависит.
Перед тем, как разбираться в том, как делать, нужно понять что конкретно ты хочешь сделать ;)

Цитата(AD @ 21.7.2009, 14:04) *
Я сейчас ее читаю. Книга полезная, интересная, но читать немного сложновато. Говорят, что читать ее проще, если знаешь функциональные языки программирования.
Так списки типов и есть, фактически, функциональное программирование :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 21.7.2009, 19:17
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


mezmay,
Цитата(mezmay @ 21.7.2009, 14:46) *
а что скажите о его книге: «Современное проектирование на С++: Обобщенное программирование и прикладные шаблоны проектирования» - хорошая?
Как сказал Kwisp, зависит от уровня читателя. Я так же пытаюсь ее освоить. Мозги скрипят, аж до соплей прошибает. Тяжело дается освоение. Но в отличае от GoF, с ее помощью я действительно продвинулся в решении своей задачи (см. соседнюю тему)

По вопросу вобщемто уже все подсказали. См. 8 главу книги Александреску -"Фабрики объектов". Там как раз описывается то что ищешь.

Сообщение отредактировал igor_bogomolov - 21.7.2009, 19:23
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.7.2009, 19:26
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(igor_bogomolov @ 21.7.2009, 20:17) *
По вопросу вобщемто уже все подсказали. См. 8 главу книги Александреску -"Фабрики объектов". Там как раз описывается то что ищешь.

Для начала главу "Списки типов"! :)))) ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 27.7.2009, 21:04
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


По иронии судьбы, встала та же задача, только типы не стандартные, а свои - пользовательские. Использовал Loki. Смысл такой: чтение заголовка карты, в зависимости от типа заголовка. Вот такой код получился (понимаю, не самый удачный код, но не закидывайте, пожалуйста, камнями - я только учусь! :) )
typedef Loki::Tuple<LOKI_TYPELIST_2(DCW_HEAD, HEAD)> TypeChart;



// ........................................................
    TypeChart header;
    QFile file(entity.name());
    if(!file.open(QIODevice::ReadOnly)) return;
    qint64 sz = -1;
    switch(key)
    {
    case T_TOPO:
        sz = file.read((char*)&Loki::Field<0>(header), sizeof(Loki::Field<0>(header)));
        if(sz == -1 || sz != sizeof(Loki::Field<0>(header))) { file.close(); return; }
        entity.setHeader(Loki::Field<0>(header).File_name, Loki::Field<0>(header).Latb, Loki::Field<0>(header).Late,
                    Loki::Field<0>(header).Lonb, Loki::Field<0>(header).Lone, Loki::Field<0>(header).C0);
    break;
    case T_MARINE:
        sz = file.read((char*)&Loki::Field<1>(header), sizeof(Loki::Field<1>(header)));
        if(sz == -1 || sz != sizeof(Loki::Field<1>(header))) { file.close(); return; }
        entity.setHeader(Loki::Field<1>(header).File_name, Loki::Field<1>(header).Latb, Loki::Field<1>(header).Late,
                    Loki::Field<1>(header).Lonb, Loki::Field<1>(header).Lone, Loki::Field<1>(header).C0);
    break;
    }
    file.close();

// ........................................................


Думаю, чем-то поможет. Функция Field<index>() - берет соответствующий тип. Насколько я понимаю, если функцию сделать шаблонной, то можно будет и упростить код. К сожалению, след. трюк не прошел:

// ........................................................
    TypeChart header;
    QFile file(entity.name());
    if(!file.open(QIODevice::ReadOnly)) return;
    qint64 sz = -1;
         int index = -1;
    switch(key)
    {
    case T_TOPO:
        index  = 0;
    break;
    case T_MARINE:
                    index = 0;
    break;
    }
         sz = file.read((char*)&Loki::Field<index>(header), sizeof(Loki::Field<index>(header)));
        if(sz == -1 || sz != sizeof(Loki::Field<index >(header))) { file.close(); return; }
        entity.setHeader(Loki::Field<index>(header).File_name, Loki::Field<index>(header).Latb, Loki::Field<index>(header).Late,
                    Loki::Field<index>(header).Lonb, Loki::Field<index>(header).Lone, Loki::Field<index>(header).C0);

    file.close();

// ........................................................


Для того, чтобы такая конструкция сработала index должен иметь тип T.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 28.7.2009, 10:43
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


2 AD Всё бы тебе на лисапедах ездить. :)
Boost.Any
Boost.Variant

Локи - прикольная библиотечка для учёбы, но для промышленного использования лучше таки Boost. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 28.7.2009, 10:49
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 28.7.2009, 11:43) *
2 AD Всё бы тебе на лисапедах ездить. :)
Boost.Any
Boost.Variant

Локи - прикольная библиотечка для учёбы, но для промышленного использования лучше таки Boost. :)

Ну впринципе я и учусь. Но все-равно спасибо! Посмотрю! :)

P.S. Почитал про указанные конструкции. Непонятно, как их применить к указанному коду?

Сообщение отредактировал AD - 28.7.2009, 11:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 28.7.2009, 16:05
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(AD @ 27.7.2009, 22:04) *
По иронии судьбы, встала та же задача, только типы не стандартные, а свои - пользовательские. Использовал Loki. Смысл такой: чтение заголовка карты, в зависимости от типа заголовка. Вот такой код получился (понимаю, не самый удачный код, но не закидывайте, пожалуйста, камнями - я только учусь! :) )
<...вырезано много букаф...>


Не очень понятно что требуется... массив Any? Или прочитать тип массива и потом массив?..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 28.7.2009, 17:00
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Andrew Selivanov @ 28.7.2009, 17:05) *
Не очень понятно что требуется... массив Any? Или прочитать тип массива и потом массив?..

Ну заголовки топографических и морских карт различаются. Поэтому значения sizeof(....) отличаются и считываемый массив данных, соответственно, тоже.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 29.7.2009, 10:25
Сообщение #15


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Ну, а что здесь непонятного? Вот тебе пример, в остальном разберешься сам:
// GCC 4.4.0 - MinGW, Win XP SP3
// boost::any example

#include "boost/any.hpp"
#include <vector>
#include <iostream>

struct Marine
{
    size_t data_size;
    // any oter data....
    Marine(): data_size(36) {};
};

struct Topo
{
    size_t header_size;
    // any oter data....
    Topo(): header_size(12) {};
};

bool is_topo(const boost::any& _elem)
{
    return _elem.type() == typeid(Topo);
}

bool is_marine(const boost::any& _elem)
{
    return _elem.type() == typeid(Marine);
}

typedef std::vector<boost::any> vec;

void process_all(const vec& _v)
{
    for(vec::const_iterator it = _v.begin(); it != _v.end(); ++it)
    {
        if (is_topo(*it))
        {
            std::cout << "Topo, header_size: " << boost::any_cast<Topo>(*it).header_size << std::endl;
            // any other processing....
        }
        else if (is_marine(*it))
        {
            std::cout << "Marine, data_size: " << boost::any_cast<Marine>(*it).data_size << std::endl;
            // any other processing....
        }
    }
}

int main()
{
    vec v;
    Marine m;
    Topo t;

    v.push_back(m);
    v.push_back(t);
    process_all(v);

    return 0;
}


С boost::variant все то же самое.......

Сообщение отредактировал Влад - 29.7.2009, 10:27
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.8.2009, 9:20
Сообщение #16


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


По мере чтения Александреску возник следующий вопрос: все, что имеется в Loki, в boost тоже есть? Или же некоторые вещи уникальны?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 4.8.2009, 10:35
Сообщение #17


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Всё есть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 4.8.2009, 11:52
Сообщение #18


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Хмм..... Обоснуешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.8.2009, 11:57
Сообщение #19


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Влад @ 4.8.2009, 12:52) *
Хмм..... Обоснуешь?

Блин. Вы меня не запутывайте. :) Так есть или нет? Одиночки, фабрики, посетители, фабричные методы, команды?

Сообщение отредактировал AD - 4.8.2009, 12:01
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.8.2009, 12:39
Сообщение #20


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Покопался в бусте. Фабрики, одиночки, команды(функторы) нашел....

Буду в этом учебном проекте использовать буст (также для изучения), а читать Александреску про Локи! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.4.2025, 17:56