В C ++ я хочу иметь класс, конструкторы которого следующие:
class A {
explicit A(A* other) { ... }
explicit A(intptr_t other) { ... }
};
Проблема в том, что пользователь инициализируется с помощью
A a(0);
Затем в 64-битной системе компилятор будет жаловаться, что не знает, следует ли преобразовать 0
в A*
или в intptr_t
, что достаточно справедливо. Поскольку я хочу, чтобы эта простая запись работала, я добавил следующий конструктор:
explicit A(int a) { assert(a==0); ... }
Утверждение состоит в том, что это единственное целое число, для которого имеет смысл. Теперь проблема возникает с 32-битной системой, в которой intptr_t
на самом деле ... int
! Поэтому теперь система жалуется, что есть два конструктора, принимающих один и тот же тип параметра (что опять-таки достаточно справедливо).
Итак, мой вопрос: есть ли способ с препроцессором обнаружить, что intptr_t
на самом деле int
и, в этом случае, не компилировать конструктор с int
. Или есть другой способ сделать запись A a(0)
действительной, не добавляя конструктор с int
, но не удаляя ни один из двух первых конструкторов (и не делая их неявными).