2012-06-02 2 views
1

Можно ли это сделать?Динамическое изменение параметров шаблона класса

Например, рассмотрим следующий фрагмент кода:

#include <iostream> 
using namespace std; 

template <typename T> class A { 
public: 
    void print() { 
    T var; 
    cout << sizeof(var) << endl; 
    } 
}; 

int main() { 
    A<int>* c = new A<int>; 
    c->print(); 

    A<char>* d = reinterpret_cast<A<char>*>(c); 
    d->print(); 
} 

Есть ли «опасность» с такого рода pratice?

ответ

3

Да, это вызовет неопределенное поведение. A<char> и A<int> - полностью несвязанные типы. Так что это не иначе, как реинтерпрет-литье как B.

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

1

Есть ли «опасность» с подобным видом?

Это неопределенное поведение, как вы преобразуете указатель на другой тип, а затем вызвать функцию.
Помните, что A<int> и A<char> - это разные марки; не путайте с тем же именем A.

Here - хорошая статья, связанная со статьей Bjarne Stroustrup.