其实,所有的答案都很好,而且内容翔实,但它们不能解决我的特殊问题。我不认为这是回答非常有帮助的人的错,而是我严厉地解释了我的问题。因此,我决定在这里发布一个全新的问题,其中包含更多相关的代码示例:Mixing Command pattern, Factory pattern and templates all together ...。如果有人关心一下......在函数调用中使用模板模板参数
现在,原题:
我不认为这是可以做到我想要什么,但我要问,以防万一....
我有一个familly我希望通过工厂创建模板类。 我使用工厂的原因是工厂有一些数据成员,用于初始化通过该工厂创建的每个类。
例如,让我们考虑这个类:
class DoSomething : public UndoableCommand< int, float >
我试图创建一个命令工厂,所以它可以创建类像上面的,并照顾他们的初始化,寿命等等
在我的(非模板)的CommandFactory,我定义了以下方法:
template < template <typename P1, typename P2, typename P3, typename P4> class CommandType>
void createCommand(P1 p1, P2 p2, P3 p3, P4 p4)
{
UndoableCommand* cmdPtr;
cmdPtr=new CommandType(P1 p1, P2 p2, P3 p3, P4 p4);
//...
}
然而,这并不编译。行 “void运算符()(P1 P1,P2 P2,P3 P3,P4 P4)” 产生以下错误:
错误C2065:P1':未声明的标识符
因为类等“DoSomething的”只有一个声明(DoSomething的总是会使用<整数,浮点>),我以为我可以使用模板参数推导,并用语法落得像:
myCommandFactory.createCommand<DoSomething>(1 /*int*/, 1.0f /*float*/);
是否有可能在所有?如果是这样,什么是适当的语法?
我想我随时可以定义我的工厂方法,如:
template <class CommandType, typename P1, typename P2, typename P3, typename P4>
void createCommand(P1 p1, P2 p2, P3 p3, P4 p4)
{
UndoableCommand* cmdPtr;
cmdPtr=new CommandType(P1 p1, P2 p2, P3 p3, P4 p4);
//...
}
,然后调用
myCommandFactory.createCommand<DoSomething, int, float>(1 /*int*/, 1.0f /*float*/);
但这是多余的,不是很优雅......
有没有这样的事,作为一个'模板class',只有'类模板'。 – pmr 2012-08-14 16:12:52