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 .

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


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


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

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

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




Репутация:   40  


Цитата(lanz @ 19.2.2013, 17:57) *
Почему, ну почему-же не подходит?! :lol:
А вот почему:
"Код"
class CodeGenerator
{
public:
    enum Lang { JAVA, CPP, LANG_END };

    virtual void generateCode()=0;
    virtual void someCodeRelatedThing()=0;

protected:
    Lang _language;
};

template <int TYPE>
class langCodeGenerator : public CodeGenerator
{
};

template <>
class langCodeGenerator<CodeGenerator::JAVA> : public CodeGenerator
{
public:
    virtual void generateCode(){ qDebug() << "CodeGenerator::JAVA - generateCode"; }
    virtual void someCodeRelatedThing(){ qDebug() << "CodeGenerator::JAVA - someCodeRelatedThing"; }
};

template <>
class langCodeGenerator<CodeGenerator::CPP> : public CodeGenerator
{
public:
    virtual void generateCode(){ qDebug() << "CodeGenerator::CPP - generateCode"; }
    virtual void someCodeRelatedThing(){ qDebug() << "CodeGenerator::CPP - someCodeRelatedThing"; }
};

template<class T, int I>
class MyFactoryImpl;

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

template<class T>
class MyFactoryImpl<T, 0>
{
public:
   static T* instance(int idx) { return idx == 0 ? new langCodeGenerator<0> : 0; }
};

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

void generate(CodeGenerator::Lang lang)
{
    CodeGenerator *p = MyFactory<CodeGenerator, CodeGenerator::LANG_END>::instance(lang);
    if( p )
    {
        p->generateCode();
        p->someCodeRelatedThing();
        delete p;
        p=0;
    }
}

int main(int , char **)
{
    for( int n = CodeGenerator::JAVA; n < CodeGenerator::LANG_END; ++n )
        generate( (CodeGenerator::Lang)n );

    return 0;
}
И если вдруг понадобится мне добавить дополнительный язык (например Python), то мне нужно будет:
1. добавить его в enum Lang перед LANG_END.
2. добавить специализацию шаблона langCodeGenerator для него:
template <>
class langCodeGenerator<CodeGenerator::PYTHON> : public CodeGenerator
{
public:
    virtual void generateCode(){ qDebug() << "CodeGenerator::PYTHON - generateCode"; }
    virtual void someCodeRelatedThing(){ qDebug() << "CodeGenerator::PYTHON - someCodeRelatedThing"; }
};
И не более того! ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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


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


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




RSS Текстовая версия Сейчас: 18.1.2025, 12:16