Sprout で遊んでみた

今や知らない人はいない空前絶後超変態ライブラリ、Sprout をちょっと使ってみました。
とりあえず、簡単に itoa の実装でも。
ソースは下記の github にあります。

[ソース]

#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION
#include <sprout/string.hpp>
#include <sprout/operation.hpp>


template<typename Char>
constexpr sprout::basic_string<Char, 1>
to_string(Char c){
    return sprout::push_front(sprout::to_string(""), c);
}


template<typename T, typename Result = sprout::string_t<16>::type>
constexpr Result
itoa_impl(T n){
    return n <= 10 ? sprout::realign_to<Result>(::to_string(char('0' + n)))
         : sprout::realign_to<Result>(itoa_impl(n/10) + ::to_string(char('0' + n%10)));
}

template<typename T, typename Result = sprout::string_t<16>::type>
constexpr Result
itoa(T n){
    return n < 0 ? sprout::realign_to<Result>(("-" + itoa_impl(-n)))
         : sprout::realign_to<Result>(itoa_impl(n));
}

int
main(){
    static_assert(itoa(12) == sprout::to_string("12"), "");
    static_assert(itoa(3980213) == sprout::to_string("3980213"), "");
    static_assert(itoa(-42) == sprout::to_string("-42"), "");

    return 0;
}

おー以前、自前で書きましたけど、Sprout を使用すると楽チンですね。
しかし、ただでさえ gcc のエラー出力に慣れてないのに、他人の書いた constexpr なエラーとか読んでいるとハゲそうです。
もっとエラーを見やすくしたい(Vim 的な意味で。


さて、Sprout で遊んでいたら Boost Advent がまだ真っ白ですよ。
これから書きます…。

[コンパイラ]

  • g++ (GCC) 4.7.0 20111112 (experimental)