crossplatform.ru

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

4 страниц V  < 1 2 3 4 >  
Ответить в данную темуНачать новую тему
> Шаблон, динамическое значения параметра шаблона, параметр не является типом
ViGOur
  опции профиля:
сообщение 15.2.2013, 11:51
Сообщение #11


Мастер
******

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

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




Репутация:   40  


Цитата(Алексей1153 @ 15.2.2013, 12:47) *
этот код и будет находится в методе-фабрике
Ну это можно и без фабрики изобразить, по крайней мере в моей структуре кода! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.2.2013, 11:53
Сообщение #12


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


ViGOur, я - за инкапсуляцию )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 15.2.2013, 12:07
Сообщение #13


Мастер
******

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

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




Репутация:   40  


да есть она там, но именно в данном случае она не нужна! :D
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.2.2013, 12:15
Сообщение #14


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


it's enough of encapsulation! No more! ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 15.2.2013, 14:20
Сообщение #15


Мастер
******

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

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




Репутация:   40  


ssoft, ты был прав, паттерн Фабричный метод самое то,единственное к нему понадобился плюс, в виде рекурсивного аргумента шаблона (это подсказал мне Flex_Ferrum) и все заработало!

Вот окончательный вариант с учетом моего примера:
class CEnumClass
{
public:
    enum eEnum{ P1, P2, P3, P_END };
};

template <class T, int I>
class CClass
{
public:
    static T *init(){ return new T; }
};

template<class T, int I>
class MyFactoryImpl;

template<class T, int I>
class MyFactoryImpl : public MyFactoryImpl<T, I - 1>
{
public:
   static T* create(int idx) { return idx == I ? CClass<T, I>::init() : MyFactoryImpl<T, I - 1>::create(idx); }
};

template<class T>
class MyFactoryImpl<T, 0>
{
public:
   static T* create(int idx) { return idx == 0 ? CClass<T, 0>::init() : 0; }
};

template<class T, int MaxI>
class MyFactory : MyFactoryImpl<T, MaxI - 1>
{
public:
   static T* create(int idx) { return MyFactoryImpl<T, MaxI - 1>::create(idx); }
};

int main(int argc, char *argv[])
{
    CEnumClass::eEnum tmpEnum = CEnumClass::P1;
    MyFactory<int, CEnumClass::P_END>::create(tmpEnum);

    return 0;
}


Сообщение отредактировал ViGOur - 19.2.2013, 16:53
Причина редактирования: Поправил, был старый вставил старый тест...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 15.2.2013, 14:55
Сообщение #16


Мастер
******

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

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




Репутация:   40  


Изменил код, так как по невнимательности вставил код немного другого теста...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 15.2.2013, 18:25
Сообщение #17


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

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


занимательно вышло, кстати, с точки зрения брейнфака )

с точки зрения практики- хм... Потом расскажешь:)

Сообщение отредактировал Алексей1153 - 15.2.2013, 18:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 18.2.2013, 10:01
Сообщение #18


Старейший участник
****

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

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




Репутация:   8  


template <typename T>
CAnimal *class_creator () {
    return new T;
};

typedef CAnimal *CAnimalPtr;
typedef CAnimalPtr (*CreatorFunc) ();
const CreatorFunc creators = {class_creator<CMurka>, class_creator<CVolk>};

class CAnimal {
    static CAnimal *Instance (CEnumClass::eEnum type) {
        static std::map<CEnumClass::eEnum, CAnimal*> here_be_singletons;
        
        if (here_be_singletons.find (type) == here_be_singletons.end ()) {
            here_be_singletons[type] = creators[type] ();
            here_be_singletons[type]->init ();
        };
        
        return here_be_singletons[type];
    };
};

Какие подводные камни?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 18.2.2013, 12:12
Сообщение #19


Мастер
******

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

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




Репутация:   40  


1. Данный код только для класса CAnimal и производных от него классов. ( я понимаю, что можно поправить, но все же! :) )
2. При добавлении типа в CEnumClass::eEnum, тебе так же нужно будет добавлять прототип функции в массив creators. (если забыл добавить, то ... )
3. Ты должен будешь соблюдать порядок типов в CEnumClass::eEnum и прототипов функций в массиве creators. (если порядок другой, то ...)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 18.2.2013, 14:11
Сообщение #20


Старейший участник
****

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

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




Репутация:   8  


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

Чего то я не очень догоняю зачем их смешивать.
Как я понял, задача состоит в том чтобы сделать N различных типов.
А зачем? Все равно они будут использоваться через один и тот же интерфейс (CAnimal*).
А если это для того чтобы сделать статическую проверку типов, то все равно ничего не выйдет (та же проблема что и в первом посте).

Можно какой нибудь пример использования?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 9:21