Boost.Generic が sandbox にて公開された
- Boost.Generic, C++0x Concepts, and C++1y Concepts
- Boost.Generic - boostjp
- Boost.Generic ソースコード - sandbox
去年の BoostCon 2011 で発表されたあたまおかしい Boost.Generic が sandbox にて公開されました。
メールに色々と書いてあるんですが、長文過ぎて全然読み切れていない…。
(Boost.Contract の話とかも出ているみたい。
また Boost.Generic を使用する場合は、Variadic Macro Data ライブラリも必要になります。
こちらも予め導入しておいて下さい。
現時点で Boost.Generic のドキュメントはまだないみたいなので、遊んでみたい方は generic/test/libs/generic/test か Boost.Generic.pdf を参照して下さい。
とりあえず、boost/generic/std_concept にいくつかの Concept が定義されていたのでちょっと試してみました。
[ソース]
#include <boost/generic/std_concept/concepts/has_plus.hpp> #include <boost/generic/std_concept/support_concepts/floating_point_type.hpp> #include <boost/generic/std_concept/support_concepts/same_type.hpp> #include <boost/generic/assert.hpp> namespace concept = boost::generic::std_concept; BOOST_GENERIC_ASSERT ( concept::FloatingPointType<float> ); BOOST_GENERIC_ASSERT ( concept::FloatingPointType<double> ); BOOST_GENERIC_ASSERT_NOT( concept::FloatingPointType<int> ); BOOST_GENERIC_ASSERT ( concept::HasPlus<int, int> ); BOOST_GENERIC_ASSERT ( concept::HasPlus<int, float> ); BOOST_GENERIC_ASSERT_NOT( concept::HasPlus<int*, int*> ); BOOST_GENERIC_ASSERT( concept::SameType< concept::HasPlus<int, float>::result_type, float > ); struct X{ int operator +(int) const { return 0; } X operator +(float) const { return X(); } }; BOOST_GENERIC_ASSERT( concept::SameType< concept::HasPlus<X, int>::result_type, int > ); BOOST_GENERIC_ASSERT( concept::SameType< concept::HasPlus<X, float>::result_type, X > ); int main(){ return 0; }
と、まぁ簡単ですがこんな感じ。
ただ、これだけだとあまり旨みが無いので、とっととオレオレ Concept とか定義して試してみたいですね。
あと完全に C++11 で書かれているようで手元で確認した限りでは、gcc 4.6.3 以降の gcc 系でのみコンパイルに成功しました。
msvc と clang は全滅。
msvc は兎も角 clang でコンパイルエラーになるのは悲しいので、ちょっと原因を調べてみたいところですね。
ってか、clang でもテストしてるようなのでコンパイルエラーになる方がおかしい。
あ、ちなみに
#include <boost/generic/std_concept/concepts.hpp>
とか include しようものなら、コンパイラが 1GB 超えのメモリを食い始めるので注意してくださいね☆(ゝω・)vキャピ
試しにコンパイルしたらマシンが悲鳴を上げて死にそうになった…。
一応、
#define BOOST_GENERIC_USE_PREPROCESSED_HEADERS
を定義しておけば改善されるみたいですがあまりよくわかっていない。
プリプロセス済みのファイルは自分で用意する必要があるのかな…?
とりあえず、これでまたおもちゃが増えましたね!!!