2010-05-25 3 views
7

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(); } 
+0

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

+1

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

+0

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é. –

Répondre

2

Qu'est-ce que vous essayez d'atteindre est fondamentalement impossible: intptr_t est un typedef pour int sur les systèmes 32 bits, de sorte que le compilateur ne peut pas les distinguer. Cependant, votre exemple pourrait être résolu en spécialisant simplement le cas de vide:

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

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

Mauvaises nouvelles alors. En ce qui concerne votre solution, je n'aime pas qu'elle traite silencieusement tous les nouveaux types int. Bien qu'il puisse être résolu avec une sorte d'assertion statique, je suppose. – vava

Questions connexes