Boost.Configぅぅぅぅぅぅぅぅぅっぅ
Boost.ConfigにはBOOST_NO_*といったコンパイラ対応等に関するマクロがありますが、これには問題があります。
例えば
#include <boost/config.hpp> void hogehoge() #if !defined( BOOST_NO_NOEXCEPT ) noexcept #endif { fugafuga ... }
のようなソースを書いたとき、BOOST_NO_NOEXCEPT*1は1.46.1にはありません。つまり現状trunkを使用しない限り常にnoexceptが付与され、つまり極稀なケースを除いてコンパイルエラーになります。
正しくは
#include <boost/version.hpp> #if BOOST_VERSION >= 104700 && !defined( BOOST_NO_NOEXCEPT )
となります。
こんなのユーザーに要求するんですか?いちいちどのマクロがどのバージョンで定義されるか覚えろと?
メンド臭い以上にナンセンスですね。Boost.Configはバージョン依存を軽減するためのライブラリなのにそれ自体がバージョン依存というのはおかしい限りです。
#if 0
但し、boost.orgにその旨を言うと即刻潰されます。「Boost.Configはinternal onlyなのでそんなこと知らん」と言われます。
internal onlyならドキュメントにそう書けよとか言いたくなりますが、英語が不自由なので黙ります。あと、書かれると使えなくなるので言いません。言ってはいけません。
#endif
そこで私はTrance.Configにつれづれなるままに書いています。
https://github.com/Flast/trance/blob/master/trance/config.hpp
と言ってもバージョンが調べられてるのはnoexceptだけですが。
今後いろいろ書いてく予定なので、もしあれ入れろこれ入れろとかあったらtwitterでもメールでも言ってください。(バージョンとかしらべやがってくださりやがるとうれしいです。
但し具体的にどのコンパイラで対応したとかは直接boost.orgにBOOST_NO_〜が必要だと言ってください。
私はBoost.Configを使いやすくしたものだけ提供します。
#if 0
だれかテスト書いてくださいドキュメント書いてくださいgithubのwiki書いてください
#endif
*1:@SubaruGさんに感謝!!