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 уже не виден и не доступен