Передать число с плавающей запятой в качестве параметра шаблона (bis)

Как до Я пытаюсь «эмулировать» параметры шаблона float на основе его записи IEEE754 благодаря reinterpret_cast. Я использую компилятор MSVC 2005 (он не поддерживает С++ 11).

Вот код:

#include <iostream>

#ifdef _MSC_VER
    typedef unsigned __int32 uint32_t;
#else
#    include <stdint.h>
#endif

template <uint32_t T>
union Other
{
    static const uint32_t i = T;
    static const float x;
};

template <uint32_t T>
const float Other<T>::x = reinterpret_cast<const float&>(Other<T>::i);

union Test
{
    static const float x;
    static const uint32_t i;
};

const float Test::x = 3.141592f;

const uint32_t Test::i = reinterpret_cast<const uint32_t&>(Test::x);

int main() 
{
    std::cout << Other<0x40490fdb>::x << std::endl; //works
    std::cout << Other<Test::i>::x << std::endl; //doesn't compile
    return 0;
}

Как видите, я не могу заставить ieee754 писать число с плавающей запятой во время компиляции. Он компилируется другим компилятором? Если нет, то почему? Можно ли добиться этого преобразования во время компиляции без С++ 11?


person matovitch    schedule 08.04.2014    source источник
comment
Похоже, вы пытаетесь эмулировать union во время компиляции? Не могли бы вы объяснить, почему вы этого хотите (особенно требование времени компиляции)? (Возможно, вы захотите прочитать о проблеме XY.)   -  person Some programmer dude    schedule 08.04.2014
comment
Действительно, союз может быть лучшим выбором, но он не решает мою проблему. На самом деле, я искал более практичный способ передачи параметров шаблона с плавающей запятой, чем MyStruct<314159265359, 100000000000>... теперь это просто для удовольствия. ;-)   -  person matovitch    schedule 08.04.2014
comment
Никто не пишет на C++ просто так. Если только ты не мазохист.   -  person Shoe    schedule 08.04.2014
comment
@Jeffrey Как мазохист, использующий MSVC 2005 ... Я знал, что мой работодатель садист! ;-)   -  person matovitch    schedule 08.04.2014