2014-12-05 5 views
2

Я изучаю шаблоны на C++, я обнаружил, что преобразование типа типа static_cast<>, dynamic_cast<>, const_cast<> и reinterpret_cast<> выглядит как шаблоны, хотя в книге сказано, что все они «операторы». Я хочу знать:Является static_cast шаблоном?

1) Будут ли эти функции броска написаны шаблонами?

2) Если это правда, где я могу найти исходный код?

3) Если это не так, почему все они разработаны в виде шаблонов? возможно ли реализовать их с помощью шаблонов?

+2

Нет, они называются _cast операторами_. –

+0

1) нет. 3) bjarne хотел, чтобы отливки были уродливыми – sp2danny

+0

@ sp2danny Не могли бы вы объяснить, почему бьярне хотел, чтобы касты были уродливыми? – maple

ответ

3

static_castи т.д. являются язык ключевые слова и, как таковые, не являются шаблонами.

Они выглядят как как шаблонов, так как это лучшая функциональная форма, чтобы выразить свою функциональность.

В какой-то степени вы можете использовать функции, аналогичные этим формам. Например, я определяю в какой-то из моего кода функции integral_cast:

template< 
     typename T/*the desired type*/, 
     typename/*the source type*/ Y 
    > T integral_cast(const Y& y) 
    { 
     static_assert(false, "undefined integral_cast"); 
    } 

    // Pass through for uint32_t 
    template<> 
    inline std::uint32_t integral_cast(const uint32_t& y) 
    { 
     return y; 
    } 

    /*and various other specialisations*/ 

Это позволяет мне конвертировать из одного интегрального типа к другому в ситуациях, когда я мог бы переполнить тип назначения. Вызывающий синтаксис идентичен встроенным методам.

+1

Другим заметным примером является Boost's ['lexical_cast'] (http://www.boost.org/doc/libs/1_57_0/doc/html /boost_lexical_cast.html). – dreamlax

+1

Qt's [qobject_cast <>] (http://qt-project.org/doc/qt-5/qobject.html#qobject_cast). – Claudio

4

Независимо от того, написаны ли эти функции броска шаблонами?

№ Как вы говорите, это операторы.

Почему все они разработаны в виде шаблонов?

Как и в случае с шаблонами, их поведение частично определяется параметром типа компиляции. Имеет смысл использовать один и тот же синтаксис, чтобы сделать то же самое в немного другом контексте.

возможно ли реализовать их по шаблонам?

Использование только основного языка C++, нет.

Вполне возможно, что static_cast, const_cast и reinterpret_cast могут быть реализованы с помощью комбинации C-стиля броска (который позволяет все эти преобразования), и C++ 11 признаков типа ограничивать преобразования в тех, которые разрешены в каждом конкретном случае. Однако некоторые из этих черт зависят от магии, которая не может быть реализована с использованием основного языка.

dynamic_cast должен получить доступ к информации об объекте RTTI; нет никакого способа сделать это, кроме как через typeid или dynamic_cast.

Смежные вопросы