crossplatform.ru

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

> Шаблон, динамическое значения параметра шаблона, параметр не является типом
ViGOur
  опции профиля:
сообщение 15.2.2013, 8:58
Сообщение #1


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

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

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




Репутация:   40  


Я создаю динамически объекты некоторых произвольных классов, родитель у них один, тип только разный.
Для вопроизведения ошибки набросал следующий код:
class CEnumClass
{
public:
    enum eEnum{
        P1,
        P2,
        P3
    };
};

template <class T, int TYPE>
class CClass
{
// ...
};

int main(int argc, char *argv[])
{
    CEnumClass::eEnum tmpEnum = CEnumClass::P1;
    const int n0 = 10;
    const int n1 = tmpEnum;

    CClass<int, 0> mc0;                // OK
    CClass<int, n0> mc1;              // OK
    CClass<int, CEnumClass::P1> mc2; // OK
    //CClass<int, n1> mc3;            // error: 'n1' cannot appear in a constant-expression
    //CClass<int, tmpEnum> mc4;  // error: 'tmpEnum' cannot appear in a constant-expression
}

В конструкции template <class T, int TYPE>, TYPE сделан для того, чтобы при инстанцировании различались типы объектов данного класса с задумкой на будущее... И данный тип передается динамически, во время выполнения программы. Тоесть, у меня из вне приходит некий tmpEnum, что в примере и я на основе него должен создать-получить объект mc4, но возникает ошибка указанная в коментарии при создании объекта mc4 .

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


И собственно вопрос, как сделать так, чтобы это работало и возможно ли это? :)
Если это не возможно, то буду думать как сделать по другому...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 19.2.2013, 11:50
Сообщение #2


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

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

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




Репутация:   8  


Цитата
1. Данный код только для класса CAnimal и производных от него классов. ( я понимаю, что можно поправить, но все же! )

Теперь шаблон.

Цитата
2. При добавлении типа в CEnumClass::eEnum, тебе так же нужно будет добавлять прототип функции в массив creators. (если забыл добавить, то ... )

Вместо этого регистрация (=1 действие), но тут никуда не дется, если берем за референс реализацию с рекурсивными шаблонами,
то там придется добавлять enum + делать полную специализацию CClass (=2 действия)
Два действия забыть проще .)

Цитата
3. Ты должен будешь соблюдать порядок типов в CEnumClass::eEnum и прототипов функций в массиве creators. (если порядок другой, то ...)

При регистрации порядок неважен.

В задаче от яндекса то же, только в профиль. Немного интересней, что зависимые от языка вещи находятся в двух местах, но это непринципиально, сюда тоже можно сунуть фабрику.
Плюсы - только уменьшеие количества мест, которые нужно исправить при переделке и как следствие повышение багоустойчивости.
Минусы - усложненная архитектура.
Вообще switch неплох, когда у нас участвует менее 6-7 элементов.
Поэтому при прочих равных, я бы максимум убрал второй switch.

Как то так.
Раскрывающийся текст
class CodeGenerator {
    virtual std::string generateCode () = 0;
    virtual std::string someCodeRelatedThing () = 0;
};

class JavaGenerator : public CodeGenerator {
    ...
}

class CodeGenFactory {
    CodeGenerator *create (Lang l) {
            switch (l) {
                case JAVA:
                    return new JavaGenerator;
                case C_PLUS_PLUS:
                    ...
            };
    };
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- ViGOur   Шаблон, динамическое значения параметра шаблона   15.2.2013, 8:58
- - ssoft   Цитата(ViGOur @ 15.2.2013, 9:58) Как я по...   15.2.2013, 9:37
- - ViGOur   Боюсь паттерн Фабричный метод здесь не поможет, де...   15.2.2013, 10:19
- - Iron Bug   если это связано с типами, то тожно тупо в констру...   15.2.2013, 10:26
- - ViGOur   Неа, в моем случае объекты p3 и p4 (ePudel и eTaks...   15.2.2013, 10:39
- - Алексей1153   имхо, виртуальное наследование спасёт ) class CDo...   15.2.2013, 11:20
- - ViGOur   Цитата(Алексей1153 @ 15.2.2013, 12:20) им...   15.2.2013, 11:33
- - Алексей1153   Цитата(ViGOur @ 15.2.2013, 14:33) Это как...   15.2.2013, 11:45
- - ViGOur   Пока я вижу выход, как я уже говорил: Цитата(ViGOu...   15.2.2013, 11:45
- - Алексей1153   и ещё - при отладке с шаблонами можно запариться, ...   15.2.2013, 11:47
- - ViGOur   Цитата(Алексей1153 @ 15.2.2013, 12:47) эт...   15.2.2013, 11:51
- - Алексей1153   ViGOur, я - за инкапсуляцию )))   15.2.2013, 11:53
- - ViGOur   да есть она там, но именно в данном случае она не ...   15.2.2013, 12:07
- - Алексей1153   it's enough of encapsulation! No more...   15.2.2013, 12:15
- - ViGOur   ssoft, ты был прав, паттерн Фабричный метод самое ...   15.2.2013, 14:20
- - ViGOur   Изменил код, так как по невнимательности вставил к...   15.2.2013, 14:55
- - Алексей1153   занимательно вышло, кстати, с точки зрения брейнфа...   15.2.2013, 18:25
- - lanz   template <typename T> CAnimal *class_creat...   18.2.2013, 10:01
- - ViGOur   1. Данный код только для класса CAnimal и производ...   18.2.2013, 12:12
- - lanz   Все верно, но это из-за ограничения на то что долж...   18.2.2013, 14:11
- - ViGOur   Цитата(lanz @ 18.2.2013, 15:11) Можно как...   18.2.2013, 15:09
- - lanz   Можно так, с учетом пунктов 1, 3. Вместо енума мож...   18.2.2013, 16:47
- - ViGOur   Честно говоря, ИМХО особо ничего не поменялось... ...   19.2.2013, 10:08
- - lanz   Цитата1. Данный код только для класса CAnimal и пр...   19.2.2013, 11:50
- - Iron Bug   знаешь, я вообще перечитала твою тему с начала и п...   19.2.2013, 16:25
- - ViGOur   Да я уже сдела что хотел и вылодил описание как......   19.2.2013, 16:52
- - lanz   Почему, ну почему-же не подходит?!   19.2.2013, 16:57
- - ViGOur   Цитата(lanz @ 19.2.2013, 17:57) Почему, н...   19.2.2013, 20:56
- - lanz   Ну да, но если сравнивать: Раскрывающийся текстcla...   20.2.2013, 9:14
- - ViGOur   Со всем в принципе согласен, но как я уже говорил ...   20.2.2013, 9:47
- - lanz   Конечно надо использовать то что лучше подходит, к...   20.2.2013, 10:02


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


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




RSS Текстовая версия Сейчас: 30.1.2025, 0:58