2 #include <boost/function/function0.hpp>
6 //TODO タイプリストとかで、そのままのインタフェースでより汎用的にする
7 //非const参照を渡したい場合は?(constructorにそれはありえない)
15 FactoryMethod( const boost::function<T* (void)>& factory)
16 : m_factory(factory){}
18 T* operator() () const{ return m_factory(); }
21 operator FactoryMethod<T>( ) const
23 return FactoryMethod<T>(m_factory);
29 boost::function<T* (void)> m_factory;
39 T* operator() ( ) const {return new T();}
43 template <class T , class P1>
44 class Constructor1 : protected Constructor0<T>
49 Constructor1(const P1& p1_)
53 T* operator() ( ) const {return new T(p1);}
57 template <class T , class P1 , class P2>
58 class Constructor2 : protected Constructor1<T , P1>
63 Constructor2(const P1& p1_ , const P2& p2_)
64 : Constructor1(p1_) , p2(p2_)
67 T* operator() ( ) const {return new T(p1 , p2);}
71 template <class T , class P1 , class P2 , class P3>
72 class Constructor3 : protected Constructor2<T , P1 , P2>
77 Constructor3(const P1& p1_ , const P2& p2_ , const P3& p3_)
78 : Constructor2(p1_ , p2_) , p3(p3_)
81 T* operator() ( ) const {return new T(p1 , p2 , p3);}
85 template <class T , class P1 , class P2 , class P3 , class P4>
86 class Constructor4 : protected Constructor3<T , P1 , P2 , P3>
91 Constructor4(const P1& p1_ , const P2& p2_ , const P3& p3_ , const P4& p4_)
92 : Constructor3(p1_ , p2_ , p3_) , p4(p4_)
95 T* operator() ( ) const {return new T(p1 , p2 , p3 , p4);}
99 template <class T , class P1 , class P2 , class P3 , class P4, class P5>
100 class Constructor5 : protected Constructor4<T , P1 , P2 , P3, P4>
105 Constructor5(const P1& p1_ , const P2& p2_ , const P3& p3_ , const P4& p4_, const P5& p5_)
106 : Constructor4(p1_ , p2_ , p3_, p4_), p5(p5_)
109 T* operator() ( ) const {return new T(p1 , p2 , p3 , p4, p5);}
113 //{{{ makeFactoryMethod
118 return FactoryMethod<T>( Constructor0<T>() );
121 template<class T , class P1>
123 makeFactoryMethod(const P1& p1)
125 return FactoryMethod<T>( Constructor1<T , P1>(p1) );
128 template<class T , class P1 , class P2>
130 makeFactoryMethod(const P1& p1 , const P2& p2)
132 return FactoryMethod<T>( Constructor2<T , P1 , P2>(p1 , p2) );
135 template<class T , class P1 , class P2 , class P3>
137 makeFactoryMethod(const P1& p1 , const P2& p2 , const P3& p3)
139 return FactoryMethod<T>( Constructor3<T , P1 , P2 , P3>(p1 , p2 , p3) );
142 template<class T , class P1 , class P2 , class P3 , class P4>
144 makeFactoryMethod(const P1& p1 , const P2& p2 , const P3& p3 , const P4& p4)
146 return FactoryMethod<T>( Constructor4<T , P1 , P2 , P3 , P4>(p1 , p2 , p3 , p4) );
149 template<class T , class P1 , class P2 , class P3 , class P4, class P5>
151 makeFactoryMethod(const P1& p1 , const P2& p2 , const P3& p3 , const P4& p4, const P5& p5)
153 return FactoryMethod<T>( Constructor5<T , P1 , P2 , P3 , P4 , P5>(p1 , p2 , p3 , p4, p5) );