Динамическое создание шаблона - PullRequest
13 голосов
/ 16 октября 2011

У меня есть шаблон класса, и мне нужно объявить объект этого класса, не определяя параметры типа, чтобы я мог их условно определить позже, например:

template<typename T>
class A{
public:
    A(T v){var = v};
    ~A(){};

    T var;
}

int main(){
    A<>* object; // Or sometihng along these lines...?
    if(/* something*/)
        object = new A<float>(0.2f);
    else{
        object = new A<int>(3);
    }
}

Ответы [ 4 ]

8 голосов
/ 16 октября 2011

Ну, вы, конечно, не можете этого сделать.Вам нужно сделать A наследуемым от другого класса, например:

template<typename T>
class A : public B {
public:
    A(T v){var = v};
    ~A(){};

    T var;
}

int main(){
    B* object;
    if(/* something*/)
        object = new A<float>(0.2f);
    else{
        object = new A<int>(3);
    }
}
4 голосов
/ 16 октября 2011

Самый простой способ сделать это - использовать другую функцию.

template<typename T> void other_stuff(A<T>* object) {
    // use T here
}
int main() {
    if (condition)
        other_stuff(new A<float>(0.2f));
    else
        other_stuff(new A<int>(3));
}

Это поддерживает всю информацию о типе и не зависит от наследования. Недостатком наследования является то, что T не может появляться ни в каких интерфейсах функций, но в этой ситуации это возможно.

3 голосов
/ 16 октября 2011

Шаблоны раскрываются во время компиляции, поэтому ваша проблема на самом деле такая же, как и следующая:

struct A_float {            // struct is easier when everything's public
    A(float v) : var(v) {}  // (use the ctor-initializer please!)
    ~A() {}

    float var;
};                          // don't forget the semicolon

struct A_int {
    A(int v) : var(v) {}
    ~A() {}

    int var;
};

int main() {
    WhatType* object; // What type here?
    if (/* something*/)
        object = new A_float(0.2f);
    else
        object = new A_int(3);
}

Надеюсь, если вы увидели приведенный выше код, вы бы подумали (так же как и «возможно»Я должен использовать шаблоны ")" Мне понадобится общий базовый класс для этого, иначе я рефакторинг".

Когда вы создадитедва типа во время компиляции с использованием шаблона класса, этот вывод один и тот же.

  • Я бы порекомендовал рефакторинг, выбрав решение, подобное Puppy's ;создание иерархии наследования просто для обхода недостатка потока логики программы - это программирование в обратном направлении!
0 голосов
/ 04 марта 2012

Вы можете использовать указатель void при создании объекта класса AПосмотрите на следующий пример кода:

template<typename T>
class A
{
 public:
    A(T v){var = v;};
    A(){};
    ~A(){};
    T var;
};
int main(){
    A<void *> object; 
    if(1){ // do this
        object = new A<float>(0.31f);
        // type cast void pointer to get value
        cout<<*(float*)object.var;    
    }
    else{ // else do this
        object = new A<int>(34);
        // type cast void pointer to get value
        cout<<*(int*)object.var;    
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...