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(); }
Cosa c'è di sbagliato con qualcosa come '#if COMPILING_FOR_64_BIT_PLATFORM'? (Inoltre, è necessario correggere i tipi di ritorno delle specializzazioni.) – sbi
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
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. –