2010-05-25 4 views
7

Ich habe eine Vorlage Ich möchte mit zwei Int-Typen zu spezialisieren, einer von ihnen schlicht alt int und ein anderer ist intptr_t. Auf 64-Bit-Plattformen haben sie unterschiedliche Größen und ich kann das mit Leichtigkeit tun, aber auf 32 Bit sind beide Typen gleich und der Compiler wirft einen Fehler bei der Neudefinition. Was kann ich tun, um es zu beheben, außer dass eine der Definitionen mit dem Präprozessor deaktiviert wird?Wie kann man Template mit intptr_t in 32 und 64 Bit Umgebungen zuverlässig spezialisieren?

Einige Code als Beispiel:

template<typename T> 
type * convert(); 

template<> 
type * convert<int>() { return getProperIntType(sizeof(int)); } 

template<> 
type * convert<intptr_t>() { return getProperIntType(sizeof(intptr_t)); } 

//this template can be specialized with non-integral types as well, 
// so I can't just use sizeof() as template parameter. 
template<> 
type * convert<void>() { return getProperVoidType(); } 
+0

Was ist los mit so etwas wie '#if COMPILING_FOR_64_BIT_PLATFORM': Allerdings könnte Ihr Beispiel nur durch Spezialisierung der Lücke Fall gelöst werden? (Sie müssen auch die Rückgabetypen der Spezialisierungen korrigieren.) – sbi

+1

Wenn Sie dies wirklich mit der Schablonenmagie tun wollen, dann können Sie etwas mit 'enable_if' erzeugen, das nur aktiviert, wenn' int' und 'intptr_t' sind nicht vom selben Typ. – sbi

+0

Warum müssen Sie die Vorlage für jeden Typ explizit spezialisieren? Warum haben Sie nicht nur eine Vorlage für alle Typen 'T', die' getProperIntType (sizeof (T)) 'aufrufen? Wenn es wichtig ist, nur Integer-Typen auf diese Weise zu behandeln, können Sie eine Hilfsfunktion mit SFINAE (google that) übergeben, aber seien Sie gewarnt: es ist chaotisch. –

Antwort

2

, was Sie erreichen möchten, ist im Grunde unmöglich: intptr_t ein typedef für int auf 32-Bit-Systemen ist, so dass der Compiler sie nicht unterscheiden kann.

template<typename T> 
type * convert() { return getProperIntType(sizeof(T)); } 

template<> 
type * convert<void>() { return getProperVoidType(); } 
+0

Schlechte Nachrichten dann. Was Ihre Lösung betrifft, so mag ich es nicht, dass sie stillschweigend alle neuen Typen als int behandelt. Obwohl es mit einer Art statischer Behauptung gelöst werden kann, denke ich. – vava