Ifs - ; . .
Alexandrescu Modern ++ Design, 11.9, "": , , Shape, . , . dynamic_cast, , static_cast, . :
template <typename To, typename From> struct ShapeCaster
{
static To & cast(From & x) { return dynamic_cast<To&>(x); }
};
template <> struct ShapeCaster<Triangle, Shape>
{
static Triangle & cast(Shape & x) { return static_cast<Triangle&>(x); }
};
template <typename To, typename From> To & shape_cast(From & x)
{
return ShapeCaster<To, From>::cast(x);
}
, ,
To & y = shape_cast<To>::cast(x);
, .
if .