explicit специализация

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 8 мес., 1 неделя назад.

  • Автор
    Сообщения
  • #3636

    Предположим, что вы написали шаблон, и вы хотите, чтобы пользователь мог пользоваться только его полными или частичными специализациями. Напрямую explicit специализация в C++ запрещена, однако это ограничение можно легко обойти. Достаточно просто сделать неполное объявление неспециализированного шаблона. Таким образом, например, реализуется assert уровня компиляции.

    template <bool>
    struct static_assert;
    
    template <>
    struct static_assert<true>
    {
        enum
        {
            static_assertation_fault
        };
    };
    
    #define sassert(cond) \
    static_assert<static_cast<bool>(cond)>::static_assertation_fault
    
    #define os_version 10
    
    int main()
    {
        sassert(os_version > 17);
        return 0;
    }

    explicit констукторы

    Используйте explicit конструкторы везде, где это только возможно. Любое неявное поведение — источник потенциальных ошибок. Считайте, что по умолчанию все конструкторы должны быть explicit, и не делайте его таковым только в тех случаях, когда возможность неявного преобразования типов действительно является необходимой.

Для ответа в этой теме необходимо авторизоваться.