![]() |
Вопросик-двоеточие | ||
Есть несколько ситуаций, в которых оператор «вопросик-двоеточие» (или как его еще называют — «тернарный оператор») дает возможности, которых не может дать связка 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; } |
|
Статистика |
|