En C++, quiero tener una clase cuyos constructores son los siguientes:¿Cómo comprobar si un tipo es un typedef int
class A {
explicit A(A* other) { ... }
explicit A(intptr_t other) { ... }
};
El problema con esto es que si el usuario se inicializa con
A a(0);
Luego, en un sistema de 64 bits, el compilador se quejará de que no sabe si 0
se debe convertir a o al intptr_t
, lo cual es suficiente. Como quiero que esta notación simple para trabajar, he añadido el siguiente constructor:
explicit A(int a) { assert(a==0); ... }
La afirmación se debe a que este es el único número entero que esto tiene sentido para. Ahora, el problema surge con un sistema de 32 bits, en el que intptr_t
es en realidad ... int
! Entonces, ahora, el sistema se queja de que hay dos constructores que toman el mismo tipo de parámetro (que, una vez más, es lo suficientemente justo).
Así que mi pregunta es: ¿hay alguna manera con el preprocesador para detectar que intptr_t
es en realidad int
y, en ese caso, no compila el constructor con int
. O bien, ¿existe otra forma de hacer que la notación A a(0)
sea válida sin agregar el constructor con int
, pero sin eliminar ninguno de los dos primeros constructores (y tampoco implicándolos)?
No podría eliminar el constructor A (A * other) y reemplazarlo por A (A y otro). Me parece más natural (suponiendo que está copiando otro y no encadenando). –