Безопасное, проверенное приведение к базовому классу C++ без использования дополнительной строки

Скажи у меня класс B наследование от класса Aи рассмотрим следующий код:

void f(B& b) {
  A& a = b;
  g(a);
}

Есть ли способ избежать лишней линии для броска? Обратите внимание, что следующее static_cast версия не эквивалентна, так как она допускает upcasts в дополнение к downcasts:

// Potentially dangerous: doesn't check that B inherits from A
void f(B& b) {
  g(static_cast<A&>(b));
}

Редактировать: я не могу полагаться на неявное принуждение, чтобы полностью избежать актерского состава, как в ответе Брайана. Сегодня причина в том, что g Это шаблоны, и я хочу избежать ненужных реализаций, но есть и другие причины, которые возникли у меня в прошлом. В любом случае мне нужно какое-то явное приведение, чтобы получить значение типа A&,

1 ответ

Решение

Если g имеет прототип

void g(A& a);

тогда никакое использование не нужно вообще; вместо

g(b)

просто неявно преобразует lvalue B ценить A пока B действительно происходит от A, Если A происходит от Bкомпиляция не удастся (если по какой-то странной причине вы не добавили пользовательское преобразование из B в A...)

Изменить: Если вам действительно нужно, чтобы аргумент имел тип "lvalue of A"и хотите избежать приведения к производному классу, тогда рассмотрите boost:: implicit_cast.

Другие вопросы по тегам