J'ai un modèle que je veux spécialiser avec deux types d'int, l'un d'entre eux plaine vieux int
et un autre est intptr_t
. Sur la plate-forme 64 bits, ils ont des tailles différentes et je peux le faire avec facilité mais sur 32 bits les deux types sont les mêmes et le compilateur lance une erreur sur la redéfinition. Que puis-je faire pour le réparer, sauf pour désactiver une des définitions avec préprocesseur?Comment se spécialiser de manière fiable avec intptr_t dans les environnements 32 et 64 bits?
Certains code comme exemple:
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(); }
Quel est le problème avec quelque chose comme '#if COMPILING_FOR_64_BIT_PLATFORM'? (De plus, vous devez corriger les types de retour des spécialisations.) – sbi
Si vous voulez vraiment faire cela en utilisant la magie du template, je suppose que vous pourriez trouver quelque chose en utilisant une forme de 'enable_if' qui ne permet que si' int' 'intptr_t' ne sont pas du même type. – sbi
Pourquoi avez-vous besoin de spécialiser explicitement le modèle pour chaque type? Pourquoi ne pas avoir un template pour tous les types 'T' qui appelle' getProperIntType (sizeof (T)) '? S'il est important de ne traiter que les types entiers de cette façon, vous pouvez passer à une fonction d'aide en utilisant SFINAE (google that) mais soyez prévenus: c'est désordonné. –