boost::parameter を class template で使う
#include <map> #include <string> #include <boost/parameter.hpp> #include <boost/static_assert.hpp> #include <boost/type_traits/is_same.hpp> BOOST_PARAMETER_TEMPLATE_KEYWORD(key) BOOST_PARAMETER_TEMPLATE_KEYWORD(value) BOOST_PARAMETER_TEMPLATE_KEYWORD(compare) BOOST_PARAMETER_TEMPLATE_KEYWORD(allocator) typedef boost::parameter::parameters< boost::parameter::required<tag::value>, boost::parameter::required<tag::key>, boost::parameter::optional<tag::compare>, boost::parameter::optional<tag::allocator> > class_signature; template< typename Arg0, typename Arg1, typename Arg2 = boost::parameter::void_, typename Arg3 = boost::parameter::void_ > struct my_map{ typedef typename class_signature::bind<Arg0, Arg1, Arg2, Arg3>::type args; typedef typename boost::parameter::binding<args, tag::key>::type key_type; typedef typename boost::parameter::binding<args, tag::value>::type value_type; typedef typename boost::parameter::binding< args, tag::compare, std::less<key_type> >::type compare_type; typedef typename boost::parameter::binding< args, tag::allocator, std::allocator<std::pair<const key_type, value_type> > >::type allocator_type; typedef std::map< key_type, value_type, compare_type, allocator_type > type; }; BOOST_STATIC_ASSERT(( boost::is_same< my_map<key<int>, value<std::string> >::type, std::map<int, std::string> >::value )); // 順番が違っても問題ない BOOST_STATIC_ASSERT(( boost::is_same< my_map<compare<std::greater<int> >, value<std::string>, key<int> >::type, std::map<int, std::string, std::greater<int> > >::value ));
BOOST_PARAMETER_TEMPLATE_KEYWORD で名前を生成し、boost::parameter::parameters でパラメータリストを作成します。
あとは使用するクラス内で、作成した class_signature と boost::parameter::binding を使い、名前でクラスを検索してきます。
デフォルト値はこのタイミングで設定するみたい。
class template ならば実行速度が気にならないので、複雑な template 引数を持つクラスの場合は、積極的に使ったほうが使う側も読む側も分かりやすいかも知れないですね
うむ、面白い。
デフォルト値の引数の順番が気にならないのが素晴らしい。
[boost]
ver 1.44.0
[参照]
http://live.boost.org/doc/libs/1_41_0/libs/parameter/doc/html/index.html