我有一个装饰者样式的基础,需要一个构造参数。装饰器的构造方式是它可以将任意数量的附加组件作为模板参数(本例中最多3个)。装饰者需要一个构造参数的基础
不幸的是,当指定多个加载项时,我无法弄清楚如何将基础的构造函数参数传递给它。在下面的示例中,CMyClass<AddOn_A> A(100);
完美工作,但CMyClass< AddOn_A, AddOn_B > AB(100);
在CMyClass构造函数中生成错误。
template< class Base >
class AddOn_A : public Base
{
public:
AddOn_A(int x) : Base(x)
{
};
int AddOne()
{
return static_cast< Base* >(this)->DoSomething() + 1;
};
};
template< class Base >
class AddOn_B : public Base
{
public:
AddOn_B(int x) : Base(x)
{
};
int AddTwo()
{
return static_cast< Base* >(this)->DoSomething() + 2;
};
};
class CBase
{
public:
explicit CBase(int x) : x_(x)
{
};
int DoSomething()
{
return x_;
};
private:
int x_;
};
// define an empty AddOn
template<class> class empty {};
// forward declaration and Add-On defaults
template< template<class> class AddOn1 = empty,
template<class> class AddOn2 = empty,
template<class> class AddOn3 = empty >
class CMyClass;
// specialized template for the default case
template<> class CMyClass< empty, empty, empty > {};
// actual definition
template< template<class> class AddOn1,
template<class> class AddOn2,
template<class> class AddOn3 >
class CMyClass : public AddOn1<CBase>,
public CMyClass< AddOn2, AddOn3 >
{
public:
// what needs to go here???
CMyClass(int x) : AddOn1<CBase>(x)
{};
};
int _tmain(int argc, _TCHAR* argv[])
{
// works
CMyClass<AddOn_A> A(100);
_ASSERT(A.AddOne() == 101);
// works
CMyClass<AddOn_B> B(100);
_ASSERT(B.AddTwo() == 102);
// generates an error at the CMyClass ctor:
// error C2512: 'CMyClass<AddOn1>' : no appropriate default constructor available
CMyClass< AddOn_A, AddOn_B > AB(100);
_ASSERT(AB.AddOne() == 101);
_ASSERT(AB.AddTwo() == 102);
return 0;
}
如果有人能指出我可能做错了什么,请告诉我。
感谢, PaulH
完美的作品。感谢您的解释! – PaulH 2009-10-21 22:08:02