Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Метатип (не знаю как назвать))) 
V
    Опции темы
volatile
Дата 13.9.2013, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



borisbn, поверхностно посмотрел, (может чо не уловил)

в общем я бы сделал так
Цитата(borisbn @  11.9.2013,  14:35 Найти цитируемый пост)
template< class T, int ID >
struct Snake : public Base {
    T head;
    T body;
    T tail;
    virtual int id() const { return ID; }
};

эту структуру, переименовал бы в класс, члены убрал бы в приват.
А в паблик добавил виртуальные геттеры/сеттеры для каждого члена.

Дальше, использование, почти как вы и хотели:
Код

Base * p;
if ( condition ) {
    if ( sub_condition ) {
        p = new Type_1;
    }
    else {
        p = new Type_2;
    }
}
else {
    if ( sub_condition ) {
        p = new Type_2;
    }
    else {
        p = new Type_4;
    }
}
p->set_head (data);
p->set_body (data);
p->set_tail (data);


borisbn, так не пойдет?
щас спешу просто, и не вникал глубоко, если что не пинайте. 
PM MAIL   Вверх
mes
Дата 13.9.2013, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  11.9.2013,  13:35 Найти цитируемый пост)
P.S. Какой-то сумбурный вопрос получился, но, я надеюсь, вы поняли, что я хотел

не совсем, особенно учитывая реакцию на предложенные варианты ;)

с базой все ясно : 
Код

// копия с первого поста:
struct Base {
    virtual int id() const = 0;
};
template< class T, int ID >
struct Snake : public Base {
    T head;
    T body;
    T tail;
    virtual int id() const { return ID; }
};

Цитата

кстати, почему бы для инициализации не использовать конструктор? 

Цитата(borisbn @  12.9.2013,  15:58 Найти цитируемый пост)

В реальном проекте я не могу менять struct Snake


а зачем менять ? можно так :
Код

// constructor :)
template<class T, int id>
Snake<T, id> CreateSnake(T const& data)
{
  Snake<T,id> snake;
  snake.head= data;
  snake.body = data;
  snake.tail = data;
  return snake;
}


Добавлено через 2 минуты и 22 секунды
если в "конструкторе" местами параметры поменять , то при вызове достаточно будет указать только id...
но зависит от ситуации, нужно ли это.. 


Это сообщение отредактировал(а) mes - 13.9.2013, 22:13


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 14.9.2013, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



volatile, 
Цитата(borisbn @  12.9.2013,  16:58 Найти цитируемый пост)
У базового класса нет field1 и field2. Они есть только у наследников. 



Цитата(mes @  13.9.2013,  22:13 Найти цитируемый пост)
можно так :
Код
// constructor :)
template<class T, int id>
Snake<T, id> CreateSnake(T const& data)
{
  Snake<T,id> snake;
  snake.head= data;
  snake.body = data;
  snake.tail = data;
  return snake;
}


Цитата(borisbn @  12.9.2013,  14:46 Найти цитируемый пост)
В общем, пока сделал так:
Код

template< class T >
Base * createSnake( const Data & data ) {
    T * t = new T;
    t->head = data;
    t->body = data;
    t->tail = data;
    return t;
}
...
Data data;
Base * ptr = 0;
if ( condition ) {
    if ( sub_condition ) {
        ptr = createSnake< Type_1 >( data );
    }
    else {
        ptr = createSnake< Type_2 >( data );
    }
}
else {
    if ( sub_condition ) {
        ptr = createSnake< Type_3 >( data );
    }
    else {
        ptr = createSnake< Type_4 >( data );
    }
}

но и здесь мне не нравится copy-paste....


Пожалуй, остановлюсь на этом варианте.
Всем большое спасибо.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 14.9.2013, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  14.9.2013,  16:54 Найти цитируемый пост)
В общем, пока сделал так:

Цитата(borisbn @  14.9.2013,  16:54 Найти цитируемый пост)
Base * createSnake

не понятно зачем ограничивать шаблонную функцию возвращением базового типа... 

во вторых не понятно , что на самом деле есть 
Цитата(borisbn @  14.9.2013,  16:54 Найти цитируемый пост)
if ( condition )

действительное ли условие или просто идентификатор.. 

Цитата(borisbn @  14.9.2013,  16:54 Найти цитируемый пост)
но и здесь мне не нравится copy-paste....

часть копи-паста решается помешением в функцию .. возможно с возвращением креаторной функции.. 

но как мне кажется сложность заключается в том, что тс вместо задачи озвучивает свое видение решения...




--------------------
PM MAIL WWW   Вверх
akizelokro
Дата 16.9.2013, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Ни один из вариантов мне не нравится.
Всё это не нравится и некрасиво.
Даже с заданными начальными условия. А вот какой придурок мне поставил минус в статьях за закономерный смешок по поводу вооюще нуклюжего.. щас найду)
Я сам тогда после реакции поржал. От количества дефайнов и тэгов код красивее не становится)

Добавлено через 14 минут и 21 секунду
я бы решил бы делать так

int (*PF(bool, bool)) = 0;

class 
template <PF>
class IolkiPalki
{
bool conditiom;
bool subcondition;
int GoodBye() { IolkiPalki(condition, subcondition); 
};

Ну, мысль ясна. 
class Ave(bool s, bool s1)
{
  if (s1)
res =1;
...
// тоси босе
}

template <class T, class PF>
struct Snake: Base
{
...
int Bandaleiros( return PF.GoodBye(); };
}

bool condition..
bool subcondition ...
Ave ave(condition, subcondition);


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
borisbn
Дата 16.9.2013, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(mes @  14.9.2013,  19:31 Найти цитируемый пост)
но как мне кажется сложность заключается в том, что тс вместо задачи озвучивает свое видение решения...

Ок.
Есть два приложения, которые обмениваются по сети. Интерфейс сетевого модуля требует на входе Base * (на самом деле, как Вы понимаете, в нём побольше функций, чем я привёл).
Если я хочу отправить некие данные, то я должен создать наследника Base, заполнить его поля и передать его в сетевой модуль. Тот его сериализует и отправит по сети. На приёме в зависимости от типа упаковки (ID) он десериализуется и отправляется "подписчику".
В случае, который я описал, конкретный тип (ID) сетевой упаковки определялся по некоторым условиям (да, действительно условиям, а не "просто идентификатор"), однако содержимое упаковок абсолютно одинаковое.
Код, который я привёл в первом сообщении мне не понравился, и я подумал, что коллективный разум мне поможет  smile 


Цитата(akizelokro @  16.9.2013,  01:18 Найти цитируемый пост)
Даже с заданными начальными условия. А вот какой придурок мне поставил минус в статьях за закономерный смешок по поводу вооюще нуклюжего.. щас найду)
Я сам тогда после реакции поржал. От количества дефайнов и тэгов код красивее не становится)

Что это было ??? 
akizelokro, Вы точно не ошиблись веткой ?

Цитата(akizelokro @  16.9.2013,  01:18 Найти цитируемый пост)
Ну, мысль ясна. 

 smile 

Цитата(akizelokro @  16.9.2013,  01:18 Найти цитируемый пост)
template <class T, class PF>
struct Snake: Base
{
...
int Bandaleiros( return PF.GoodBye(); };
}

У типа нельзя вызывать нестатические методы  smile 

Это сообщение отредактировал(а) borisbn - 16.9.2013, 10:32


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xvr
Дата 16.9.2013, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(borisbn @  16.9.2013,  10:30 Найти цитируемый пост)
однако содержимое упаковок абсолютно одинаковое.

Тогда надо от этого и отталкиваться. Соберите это самое содержимое в контейнер (в структуру в простейшем случае), а дальше фабрика для сериализатора и инициализация готового сириализатора контейнером

PM MAIL   Вверх
mes
Дата 16.9.2013, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(borisbn @  16.9.2013,  09:30 Найти цитируемый пост)
однако содержимое упаковок абсолютно одинаковое.

так зачем плодить наследников, если отличие только в id ??  сделайте одного наследника с динамическим id и радуйтесь жизни smile
или есть еще условия, не озвученные здесь ?! 



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0535 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.