Boost.TypeErasure の any は暗黙の型変換が行われない
Boost.TypeErasure の any のコンストラクタは explicit で定義されており、暗黙の型変換が行われません。
これは次のように関数の引数に any を使用する場合に問題になります。
[ソース]
#include <boost/type_erasure/any.hpp> #include <boost/type_erasure/operators.hpp> #include <boost/mpl/vector.hpp> #include <iostream> typedef boost::mpl::vector< boost::type_erasure::ostreamable<>, boost::type_erasure::copy_constructible<> > disp_concept; void disp(boost::type_erasure::any<disp_concept> const& any){ std::cout << any << std::endl; } #include <string> int main(){ // ok disp(boost::type_erasure::any<disp_concept>(10)); disp(boost::type_erasure::any<disp_concept>(std::string("homu"))); // error // disp(10); // disp(std::string("homu")); return 0; }
[出力]
10 homu
こんな感じに関数に渡す場合に明示的に any に変換してから渡す必要があります。
実際にこういう関数の引数に any を定義して使用したい場合はあると思うんですが、これだとちょっと冗長な気がしますね。
Concept も呼び出し側で指定しなければ行けませんし。
何か回避方法があるんだろか。