660 _________Часть IV. Новые возможности C++
менение этого средства. Другие компиляторы также в той или иной степени поддерживают условные объявления, и применение этих возможностей можно встретить в примерах и фрагментах кода во многих книгах и журналах.
Наиболее важным (во всяком случае в том, что касается RTTI) является использование условных объявлений для создания экземпляров переменных с ограниченной областью видимости. Рассмотрим следующий фрагмент кода:
1 void DoNothing(Base* pBase)
2 { .
3 Derived* pDerived = dynamic_cast<Derived*>(pBase) ;
4 if (pDerived){
5 // Выполняются действия с объектом
6 , cout « "Это Derived!\n" 1 }
8 // pDerived все еще виден и доступен
9 }
«
В строке 8 подчеркивается, что pDerived все еще находится в области видимости и доступен остальным функциям, несмотря на то, что он был объявлен только для того, чтобы определить, является ли pBase экземпляром объекта Derived.
В данном случае можно было бы создать новый уровень видимости:
1 void DoNothing(Base* pBase)
2 (
3 { // Начало нового уровня
4 Derived* pDerived = dynamic cast<Derived*>(pBase);
5 if (pDerived)(
6 // Выполняются действия с объектом
7 cout « "Это Derived!\n"
8 )
9 } // Конец нового уровня
10 // pDerived уже не виден и не доступен
11 }
Начиная со строки 10 и далее pDerived становится недоступным; этот же результат, но более красиво можно получить, используя условные объявления:
void DoNothing(Base* pBase) {
if (Derived* pDerived = dynamic_cast<Derived*>(pBase)) { // Выполняются действия с объектом cout « "Это Derived!\n" } // pDerived уже не виден и не доступен