2010-05-25 11 views
7

Tengo una plantilla que quiero especializarme con dos tipos de int, uno de ellos simple viejo int y el otro es intptr_t. En la plataforma de 64 bits tienen diferentes tamaños y puedo hacerlo con facilidad, pero en 32 bits ambos tipos son los mismos y el compilador arroja un error sobre la redefinición. ¿Qué puedo hacer para solucionarlo, excepto para desactivar una de las definiciones con el preprocesador?¿Cómo se puede especializar de manera confiable la plantilla con intptr_t en entornos de 32 y 64 bits?

algún código por ejemplo:

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

¿Qué hay de malo en algo como '#if COMPILING_FOR_64_BIT_PLATFORM'? (Además, debe corregir los tipos de devolución de las especializaciones). – sbi

+1

Si realmente quiere hacer esto con la plantilla de magia, supongo que podría encontrar algo con alguna forma de 'enable_if' que solo habilite si' int' y 'intptr_t' no son del mismo tipo. – sbi

+0

¿Por qué necesita especializar explícitamente la plantilla para cada tipo? ¿Por qué no solo tener una plantilla para todos los tipos 'T' que llama' getProperIntType (sizeof (T)) '? Si es importante manejar solo los tipos enteros de esta manera, puede transferirlo a una función auxiliar usando SFINAE (google eso) pero tenga cuidado: es complicado. –

Respuesta

2

Lo que estamos tratando de lograr es fundamentalmente imposible: intptr_t es un typedef para int en sistemas de 32 bits, por lo que el compilador no puede distinguirlos. Sin embargo, su ejemplo podría ser resuelto con sólo el caso especializada vacío:

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

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

Malas noticias entonces. En cuanto a su solución, no me gusta que esté tratando silenciosamente todos los tipos nuevos como int. Aunque se puede resolver con algún tipo de afirmación estática, supongo. – vava

Cuestiones relacionadas