Информация об изменениях

Сообщение Re[13]: Что должен возвращать if? от 17.10.2014 19:12

Изменено 17.10.2014 19:13 Evgeny.Panasyuk

WH>>>>Не нужна информация о том, в какой ветке, какой тип. И из какой ветки мы получили управление.
EP>>>Почему не нужна?
WH>>По тому, что мы уже обработали информацию о ветвлении внутри самого if.
EP>При вызове виртуального метода общего интерфейса (к которому привелись результаты веток) — точно также обрабатывается информация о ветвлении.
EP>Не вижу здесь принципиальной разницы с Variant.

Я даже больше скажу, теоретически вызов метода содержащегося внутри Variant может иметь абсолютно такой же синтаксис как и вызов виртуального метода:
Varaint<Triangle, Rectangle> v = ...;
v.draw();


А вот такой синтаксис можно получить в C++ прям сейчас:
Varaint<Triangle, Rectangle> v = ...;
use_concrete_type(v)
{
    v.draw();
};
Причём для всех вызовов внутри фигурных скобок не будет никакого dispatch, так как там у v один из типов — Triangle или Rectangle.
Dispatch будет только однократный, перед всеми вызовами (в отличии от виртуальных методов, где в общем случае для каждого вызова происходит индерекция).
Re[13]: Что должен возвращать if?
WH>>>>Не нужна информация о том, в какой ветке, какой тип. И из какой ветки мы получили управление.
EP>>>Почему не нужна?
WH>>По тому, что мы уже обработали информацию о ветвлении внутри самого if.
EP>При вызове виртуального метода общего интерфейса (к которому привелись результаты веток) — точно также обрабатывается информация о ветвлении.
EP>Не вижу здесь принципиальной разницы с Variant.

Я даже больше скажу, теоретически вызов метода содержащегося внутри Variant может иметь абсолютно такой же синтаксис как и вызов виртуального метода:
Variant<Triangle, Rectangle> v = ...;
v.draw();


А вот такой синтаксис можно получить в C++ прям сейчас:
Variant<Triangle, Rectangle> v = ...;
use_concrete_type(v)
{
    v.draw();
};
Причём для всех вызовов внутри фигурных скобок не будет никакого dispatch, так как там у v один из конкретных типов — Triangle или Rectangle.
Dispatch будет только однократный, перед всеми вызовами (в отличии от виртуальных методов, где в общем случае для каждого вызова происходит индерекция).