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;
}