2010-05-25 17 views
7

Ho un modello che desidero specializzare con due tipi int, uno di loro semplice int e un altro è intptr_t. Sulla piattaforma a 64 bit hanno diverse dimensioni e posso farlo con facilità ma su 32 bit entrambi i tipi sono uguali e il compilatore genera un errore sulla ridefinizione. Cosa posso fare per risolvere il problema tranne per disabilitare una delle definizioni con il preprocessore?Come specializzare in modo affidabile il modello con intptr_t in ambienti a 32 e 64 bit?

Alcuni codice come un esempio:

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

Cosa c'è di sbagliato con qualcosa come '#if COMPILING_FOR_64_BIT_PLATFORM'? (Inoltre, è necessario correggere i tipi di ritorno delle specializzazioni.) – sbi

+1

Se si vuole veramente fare questo usando il template magic, suppongo che si possa trovare qualcosa usando una qualche forma di 'enable_if' che abilita solo se' int' e 'intptr_t' non sono dello stesso tipo. – sbi

+0

Perché è necessario specializzare esplicitamente il modello per ciascun tipo? Perché non avere un solo template per tutti i tipi 'T' che chiama' getProperIntType (sizeof (T)) '? Se è importante gestire solo i tipi di interi in questo modo, è possibile passare ad una funzione di supporto usando SFINAE (google) ma attenzione: è disordinato. –

risposta

2

quello che stai cercando di raggiungere è fondamentalmente impossibile: intptr_t è un typedef per int su sistemi a 32 bit, in modo che il compilatore non è in grado di distinguere. Tuttavia, il vostro esempio potrebbe essere risolto solo specializzandosi caso vuoto:

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

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

Cattive notizie allora. Per quanto riguarda la tua soluzione, non mi piace che tratti silenziosamente tutti i nuovi tipi come int. Anche se può essere risolto con qualche tipo di asserzione statica, credo. – vava

Problemi correlati