crossplatform.ru

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


  Ответ в C++: как выбрать тип переменной во время выполнения?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 4.8.2009, 12:39
  Покопался в бусте. Фабрики, одиночки, команды(функторы) нашел....

Буду в этом учебном проекте использовать буст (также для изучения), а читать Александреску про Локи! :)
AD Дата 4.8.2009, 11:57
 
Цитата(Влад @ 4.8.2009, 12:52) *
Хмм..... Обоснуешь?

Блин. Вы меня не запутывайте. :) Так есть или нет? Одиночки, фабрики, посетители, фабричные методы, команды?
Влад Дата 4.8.2009, 11:52
  Хмм..... Обоснуешь?
Tonal Дата 4.8.2009, 10:35
  Всё есть.
AD Дата 4.8.2009, 9:20
  По мере чтения Александреску возник следующий вопрос: все, что имеется в Loki, в boost тоже есть? Или же некоторые вещи уникальны?
Влад Дата 29.7.2009, 10:25
  Ну, а что здесь непонятного? Вот тебе пример, в остальном разберешься сам:
// 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 все то же самое.......
AD Дата 28.7.2009, 17:00
 
Цитата(Andrew Selivanov @ 28.7.2009, 17:05) *
Не очень понятно что требуется... массив Any? Или прочитать тип массива и потом массив?..

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


Не очень понятно что требуется... массив Any? Или прочитать тип массива и потом массив?..
AD Дата 28.7.2009, 10:49
 
Цитата(Tonal @ 28.7.2009, 11:43) *
2 AD Всё бы тебе на лисапедах ездить. :)
Boost.Any
Boost.Variant

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

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

P.S. Почитал про указанные конструкции. Непонятно, как их применить к указанному коду?
Tonal Дата 28.7.2009, 10:43
  2 AD Всё бы тебе на лисапедах ездить. :)
Boost.Any
Boost.Variant

Локи - прикольная библиотечка для учёбы, но для промышленного использования лучше таки Boost. :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 17.4.2024, 1:26