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(); }
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
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
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. –