Правильный ответ уже дан: переключайтесь на указатели. Ссылки в этом случае дают нулевую выгоду, и, как вы видели, имеют огромный недостаток. Ваш дизайн сомнителен для начала; давайте не будем усложнять ситуацию, вводя дополнительные плохие требования.
Однако, если вы настаиваете на использовании ссылок, единственно возможное решение - это ввести какое-либо значение дозорного.
struct A {
A(Object1& o) : obj1(o), obj2(null2) { }
A(Object2& o) : obj1(null1), obj2(o) { }
void function() {
if(&obj1 == &null1)
//Object2 constructor
else
//Object1 constructor
}
private:
Object1& obj1;
Object2& obj2;
static Object1 null1;
static Object2 null2;
};
//implementation file
Object1 A::null1;
Object2 A::null2;
Этот метод зависит от того, имеют ли Object1
и Object2
конструкторы по умолчанию или иное разумное значение по умолчанию для часовых. null1
и null2
будут существовать в течение всего срока службы приложения, поэтому, если они получат какие-либо ресурсы, у вас по существу будет утечка.
Вы также должны быть намного осторожнее с недопустимым использованием часовых, поскольку такой доступ [в общем случае] совершенно безопасен. Можно привести веские аргументы в пользу того, что ошибкам лучше привести к неопределенному поведению, которое может привести к сбою, чем к четко определенному поведению, которое может просто привести к неожиданным результатам.