Особенности тернарного оператора

      Комментарии к записи Особенности тернарного оператора отключены

Помечено: , ,

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

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

    Есть несколько ситуаций, в которых оператор «вопросик-двоеточие» (или как его еще называют — «тернарный оператор») дает возможности, которых не может дать связка if-else. Речь идет об инициализации констант, ссылок и значений enum. Причем, как вы видите в приведенном ниже примере, ссылки и константы можно инициализировать по условию, проверяемом не только на этапе компиляции, но и на этапе выполнения.

    class packet
    {
    public:
    
        static int const size = sizeof(int) == 4 ? 1024 : 2048;
    
        enum
        {
            magic = size == 1024 ? 0xdeadbeef : 0xc001babe
        };
    };
    
    int main()
    {
        int const delay_min = packet::size == 1024 ? 10 : 20;
        int delay_max = packet::size == 1024 ? 20 : 40;
    
        int const& delay_inf = delay_max == 20 ? delay_min : delay_max;
    
        int const delay_sup = delay_max == 40 ? delay_min : delay_max;
    
        return 0;
    }

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

    template <unsigned int n>
    struct x
    {
        static unsigned int const value =
            x<n - 1>::value % 2 ?
            x<n - 1>::value + 3 :
            x<n - 1>::value + 7;
    };
    
    template <>
    struct x<0>
    {
        static unsigned int const value = 1;
    };
    
    int main()
    {
        unsigned int x1 = x<1>::value;
        unsigned int x2 = x<2>::value;
        unsigned int x3 = x<3>::value;
        unsigned int x4 = x<4>::value;
        unsigned int x5 = x<5>::value;
        unsigned int x6 = x<6>::value;
        unsigned int x7 = x<7>::value;
    
        return 0;
    }

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