nsf gamedevФорум

Что нужно знать о constexpr (комментарии)

#0
16:38, 5 мая 2013

Что нужно знать о constexpr (комментарии)

Это сообщение сгенерировано автоматически.

#1
16:38, 5 мая 2013

Еще оно может вычисляться во время компиляции, если значение, возвращаемое функцией, можно посчитать в compile-time, а не run-time

#include <iostream>
constexpr int F(){ return 5;}
int main(int argc, char const *argv[])
{
        int b[F()];
        std::cerr<<"sizeof(int) == "<<sizeof(int)<<"; sizeof(int b[F()]) =="<<sizeof(b)<<'\n';
        return 0;
}

Вывод: sizeof(int) == 4; sizeof(int b[F()]) ==20

и все выглядит читаемо, раньше аналогом этого был ужас с шаблонами и енумами. :)

#2
18:13, 5 мая 2013

TakeOver
Так для этого constexpr и существует. Заметка подразумевает, что читатель знает о constexpr, но не до конца понимает его. А так, да, действительно бывает удобно в некоторых местах использовать constexpr, например что-нибудь такое:

template <typename K, typename V>
class map {
        static constexpr int bucket_size = 8;
        static constexpr int max_key_size = 128;
        static constexpr int max_value_size = 128;

        static constexpr bool indirect_key() {
                return sizeof(K) > max_key_size;
        }
        static constexpr bool indirect_value() {
                return sizeof(V) > max_value_size;
        }

        struct map_bucket {
                typedef typename std::conditional<indirect_key(), K*, K>::type KK;
                typedef typename std::conditional<indirect_value(), V*, V>::type VV;

                uint8 top_hash[bucket_size];
                map_bucket *overflow;
                KK keys[bucket_size];
                VV values[bucket_size];
        };
        ...
};
nsf gamedevФорум

Тема в архиве.