In C++, voglio avere una classe i cui costruttori sono i seguenti:Come verificare se un tipo è un typedef di int
class A {
explicit A(A* other) { ... }
explicit A(intptr_t other) { ... }
};
Il problema è se l'utente inizializza con
A a(0);
Quindi, su un sistema a 64 bit, il compilatore si lamenterà che non sa se 0
deve essere convertito in A*
o intptr_t
, che è abbastanza giusto. Come voglio che questo semplice notazione per lavorare, ho aggiunto il seguente costruttore:
explicit A(int a) { assert(a==0); ... }
L'asserzione è perché questo è l'unico intero questo ha un senso per. Ora, il problema sorge con un sistema a 32 bit, in cui intptr_t
è in realtà ... int
! Così ora, il sistema lamenta che ci sono due costruttori che assumono lo stesso tipo di parametro (che, di nuovo, è abbastanza giusto).
Quindi la mia domanda è: esiste un modo con il preprocessore per rilevare che è in realtà intptr_t
int
e, in quel caso, non compilare il costruttore con int
. Oppure, esiste un altro modo per rendere valida la notazione A a(0)
senza aggiungere la funzione di costruzione con int
, ma senza rimuovere nessuno dei due primi costruttori (e non renderli impliciti neanche).
Impossibile rimuovere il costruttore A (A * altro) e sostituirlo con A (A e altro). Sembrerebbe più naturale per me (supponi che stai copiando altro e non concatenando). –