00001
00002 #ifndef INCLUDED_Factory_h_
00003 #define INCLUDED_Factory_h_
00004
00005
00006 class FactoryBase {
00007 public:
00008 virtual ~FactoryBase() {}
00009 virtual void* constructTemplate()=0;
00010 };
00011
00012
00013
00014
00015
00016
00017
00018 template<class B>
00019 class Factory : public FactoryBase {
00020 public:
00021 virtual B* construct() { return new B(); }
00022 virtual void* constructTemplate() { return construct(); }
00023 };
00024
00025
00026 template<class B, class A1, A1 a1>
00027 class Factory1Arg : public Factory<B> {
00028 public:
00029 virtual B* construct() { return new B(a1); }
00030 virtual void* constructTemplate() { return construct(); }
00031 };
00032
00033
00034 template<class B, class A1, A1 a1, class A2, A2 a2>
00035 class Factory2Arg : public Factory<B> {
00036 public:
00037 virtual B* construct() { return new B(a1,a2); }
00038 virtual void* constructTemplate() { return construct(); }
00039 };
00040
00041
00042 template<class B, class A1, A1 a1, class A2, A2 a2, class A3, A3 a3>
00043 class Factory3Arg : public Factory<B> {
00044 public:
00045 virtual B* construct() { return new B(a1,a2,a3); }
00046 virtual void* constructTemplate() { return construct(); }
00047 };
00048
00049
00050 template<class B, class A1, A1 a1, class A2, A2 a2, class A3, A3 a3, class A4, A4 a4>
00051 class Factory4Arg : public Factory<B> {
00052 public:
00053 virtual B* construct() { return new B(a1,a2,a3,a4); }
00054 virtual void* constructTemplate() { return construct(); }
00055 };
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 #endif
00069