[C++] template で2進数表記(改)
2進数表記がはやってるみたいですね。
そこで、テンプレート版を頭に0付けても大丈夫なようにしてみました。ただ、マクロにするとネームスペースからはみ出ちゃうのがちょっとなぁ。
#include <boost/config.hpp> namespace util { template <unsigned char x> struct binary_number_check { typedef binary_number_check<x> self; typedef typename self::invalid_binary_number error; }; template <> struct binary_number_check<0> {}; template <> struct binary_number_check<1> {}; template <unsigned long b> struct binary_number : binary_number_check<b % 8> { BOOST_STATIC_CONSTANT(int, value = (binary_number<b / 8>::value << 1) + (b % 8)); }; template <> struct binary_number<0> { BOOST_STATIC_CONSTANT(int, value = 0); }; #define B(b) binary_number<0 ## b>::value }こんなふうにして使います。
#include <boost/static_assert.hpp> #include "util/binary.hpp" int main(void) { BOOST_STATIC_ASSERT(util::B(0) == 0); BOOST_STATIC_ASSERT(util::B(00) == 0); BOOST_STATIC_ASSERT(util::B(1) == 1); BOOST_STATIC_ASSERT(util::B(10) == 2); BOOST_STATIC_ASSERT(util::B(010) == 2); BOOST_STATIC_ASSERT(util::B(00000100) == 4); BOOST_STATIC_ASSERT(util::B(00001000) == 8); BOOST_STATIC_ASSERT(util::B(00010000) == 16); BOOST_STATIC_ASSERT(util::B(00100000) == 32); BOOST_STATIC_ASSERT(util::B(01000000) == 64); BOOST_STATIC_ASSERT(util::B(10000000) == 128); BOOST_STATIC_ASSERT(util::B(11111111) == 255); return 0; }
TrackBack URL: http://blog.f99aq8ove.net/comment.cgi/tb/1192340317/





