Брутально и бессердечно о программировании и проектировании
ГлавнаяФорумАртПаттерныАнтипаттерныТест-драйвВопрос-ответКнигорецензииСправочная

Вопросик-двоеточие

Есть несколько ситуаций, в которых оператор «вопросик-двоеточие» (или как его еще называют — «тернарный оператор») дает возможности, которых не может дать связка if-else. Речь идет об инициализации констант, ссылок и значений enum. Причем, как вы видите в приведенном ниже примере, ссылки и константы можно инициализировать по условию, проверяемом не только на этапе компиляции, но и на этапе выполнения.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
}
 
Кроме того, оператор «вопросик-двоеточие» бывает очень часто удобен для манипулирования процессами развертки шаблонов.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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;
}

Оглавление
Статистика
© 2007—2009 Inside C++ Коммерческие услугиКонтактная информация

купить стальные двери в магазине. продвижение сайта новые услуги