Агрегация подразумевает, что boost::variant
содержит как TypeA
, так и TypeB
. Это не так. Он содержит либо TypeA
, либо TypeB
. Это больше похоже на объединение, чем на структуру.
Вы можете передать TypeA
по значению, поскольку существует неявное преобразование из TypeA
в Type
.
Не существует неявного преобразования из TypeA&
в Type&
(или TypeA*
в Type*
), и не должно быть. Подумайте о том, что произойдет, если ссылка на TypeA
объект будет передана в foo()
, и foo()
решит заменить его значением TypeB
.
Не зная, что такое foo()
и TypeA
/ TypeB
, я не могу дать вам более конкретный совет, но, возможно, вы можете использовать шаблон функции. т.е.
template <typename T>
void foo(T& t) {}
или перегруженные функции:
void foo(TypeA& t) {}
void foo(TypeB& t) {}