Безопасное, проверенное приведение к базовому классу 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.