2013-04-18 11 views
5

mein Code:Nicht Datentyp Template-Parameter, mehr Spezialisierung erzeugt?

#include <iostream> 

using namespace std; 


template <typename T, int X> 

class Test 
{ 
    private: 
    T container[X]; 
    public: 
    void printSize(); 

}; 
template <typename T, int X> 
void Test<T,X>::printSize() 
{ 
    cout <<"Container Size = "<<X <<endl; 
} 


int main() 
{ 
    cout << "Hello World!" << endl; 
    Test<int, 20> t; 
    Test<int, 30> t1; 

    t.printSize(); 
    t1.printSize(); 
    return 0; 
} 

Frage:

  1. Wie viele Spezialisierung generiert bekommen ?. Wenn ich richtig verstehe, erzeugt es zwei Spezialisierungen, die eine für <int, 20> ist und eine andere für <int, 30>. Bitte korrekt, wenn mein Verständnis falsch ist?
  2. Gibt es eine Möglichkeit, die Anzahl der Spezialisierungen zu sehen/zu überprüfen, die durch Reverse Engineering generiert wurden?
+1

Diese http://stackoverflow.com/questions/4448094/can-we-see-the-template-instantiated-code-by-c-compiler – FireAphis

+0

@FireAphis helfen kann, danke für den Link. – Whoami

Antwort

2

1) ja, zwei instantiations werden vom Compiler, aber die Linker erzeugt werden könnten Funktionen mit identischem generierten Code fusionieren (gesamte Programmoptimierung zB) verwendet wird, die eine nette Weise ist Code aufblasen zu reduzieren .

2) siehe question, wo erklärt wird, wie gcc Template Instanziierung Ausgabe generieren kann.

3

Es gibt nicht Spezialisierungen hier nur instantiations (this questions erklärt den Unterschied). Dieser Code generiert zwei Instanzen der Klassenvorlage Test.

+0

Ich denke, wenn ich Spezialisierungen sage, meinte er generierte Klassen. Ich verstehe eigentlich nicht, warum zwei (Klassen) erstellt werden, wenn es immer noch ein int in beiden Zeiten ist. – Infested

+0

@Infested der Wert von 'X' unterscheidet sich – TemplateRex

+0

@rhalbersma ive bemerkte, dass, aber es ist immer noch ein Int. Wie würde ich es schreiben, so dass der "X" -Teil keinen Unterschied macht? – Infested

0

1) Wie viele Spezialisierungen werden generiert ?. Wenn ich richtig verstehe, erzeugt es zwei Spezialisierungen, für die man ist, und ein anderes ist für. Bitte korrekt, wenn mein Verständnis falsch ist?

Ja, es gibt zwei.

2) Gibt es eine Möglichkeit, die Anzahl der Spezialisierungen zu sehen/zu überprüfen, die von einem Reverse Engineering generiert wurden?

Wenn Sie den Code haben, brauchen Sie kein Reverse Engineering. Wenn Sie es nicht haben, können Sie es nicht mit generiertem Code herausfinden, weil es Kompilierzeit ist.

0

a) In Ihrem Beispiel werden 2 Instanzen der Spezialisierung erstellt.

b) Es gibt keine integrierte Methode, um die Anzahl der für eine Klasse generierten Spezialisierung zu unterstützen. Wenn es Ihr Projekt ist, können Sie statische Zählung hinzufügen. Wenn Sie möchten, können Sie Ihren eigenen Referenzzählungsmechanismus für Ihre Klasse schreiben. Inkrementieren Sie die statische Anzahl in unserem Konstruktor.

static int created = 0; 
static int alive = 0; 
class Test 
{ 
counter() 
    { 
     created++; 
     alive++; 
    } 
~counter() 
{ 
    created--; 
} 
//Rest of class 
}; 
+0

Ihr Zähler würde die Anzahl der Instanzen der Klasse zählen, nicht die Instanziierungen der Vorlage. – Angew