#include <boost/preprocessor.hpp> #define CTOR_TEMPLATE_MAX_ARITY 10 #define DEFINE_CTOR_TEMPLATE(z, n, type_pair) \ template< BOOST_PP_ENUM_BINARY_PARAMS( BOOST_PP_INC(n), class BOOST_PP_INTERCEPT, A ) > \ BOOST_PP_TUPLE_ELEM(2, 1, type_pair) ( BOOST_PP_ENUM_BINARY_PARAMS( BOOST_PP_INC(n), A, const & a ) ) \ : BOOST_PP_TUPLE_ELEM(2, 0, type_pair) ( BOOST_PP_ENUM_PARAMS(BOOST_PP_INC(n), a) ) \ { } \ #define DEFINE_CTOR_TEMPLATES(old, name) \ BOOST_PP_REPEAT(CTOR_TEMPLATE_MAX_ARITY, DEFINE_CTOR_TEMPLATE, (old, name) ) \
上のDEFINE_CTOR_TEMPLATESマクロは,単に
template<class A0> name(A0 const &a0) : old(a0){ } template<class A0, class A1> name(A0 const &a0, A1 const &a1) : old(a0, a1){ } ..... template<class A0, ....., class A9> name(A0 const &a0, ....., A9 const &a9) : old(a0, ....., a9){ }
というのを吐くだけ.これを使って
// strong typedefをエミュレート class int_vec : public std::vector<int> { typedef std::vector<int> base_t; public: int_vec() : base_t(){ } DEFINE_CTOR_TEMPLATES(base_t, int_vec) }; // typedef templateをエミュレート (strong typedefの意味で) template<class T, class A = std::allocator<T> > class rev_set : public std::set<T, std::greater<T>, A> { typedef std::set<T, std::greater<T>, A> base_t; public: rev_set() : base_t(){ } DEFINE_CTOR_TEMPLATES(base_t, rev_set) }; int main() { int a[10] = {0,1,2,3,4,5,6,7,8,9}; int_vec v((int *)a, a + 10); rev_set<int> s((int *)a, a + 10); std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; std::copy(s.begin(), s.end(), std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; }
と色々やってみたものの結局上が関の山.constじゃない引数を取るコンストラクタ(珍しいけれど)があるとダメ.public継承をこういう目的で使うと他の要因と複合して何か危険な落とし穴が出来てるかも知れないし・・・.上のままだとPODのStrong Typedefが出来ないけれど,そっちはすでに話がいくつもあるから良いや.
いずれにせよ(´・ω・`)ショボーン
#(2004/10/27追記)やっぱり上は全然ダメ.完全に却下.コンストラクタのexplict指定が隠蔽されるわ,標準のクラスからの継承は保証外だわで散々だ.却下,却下.