2017-01-01 9 views
1

Преамбула: Я просмотрел constexpr initializing static member using static function, но (спасибо ответу Олега Богданова) Я не пытаюсь инициализировать статику.компиляция времени вычисления функции для вычисления константы

Я хотел бы знать, как сделать следующую работу:

typedef uint32_t color_t;  // represent color as 00rrggbb 

class Color { 
    static color_t makeColor(const uint8_t r, 
          const uint8_t g, 
          const uint8_t b) { 
    return (((color_t)r << 16) | ((color_t)g << 8) | (color_t)b); 
    } 
    static const color_t kRed = makeColor(255, 0, 0); 
} 

Как я понимаю, компилятор должен быть сказано, что он может оценить makeColor() во время компиляции, так что я думаю, что это работа для constexpr. Несмотря на все мои усилия на окропление вокруг constexpr и const, я все еще получаю

error: field initializer is not constant 

Что мне не хватает?

P.S .: Я могу, конечно, сделать то, что я хочу с #define:

#define makeColor(r, g, b) (((color_t)(r) << 16) | ((color_t)(g) << 8) | (color_t)(b)) 

... но, кажется, так 20-го века!

ответ

2

На самом деле вы были очень близки к цели, что делает makeColor constexpr будет достаточно, если вы удалите static из kRed

Demo

Почему именно static проблематично объясняется в this answer

+0

Perfect - спасибо. (И спасибо также за указатель на https://godbolt.org) –

+1

Рад помочь. Проект Matt Godbolt - это, наверное, лучшая вещь, которая произошла с сообществом C++ за последние годы :) –