实际上,所有答案都很好,而且内容丰富,但它们并没有解决我的特定问题。我不认为这是回答的非常乐于助人的人的错,而是我的问题措辞很糟糕。因此,我决定在这里发布一个带有更多相关代码示例的全新问题:Mixing Command pattern, Factory pattern and templates all together ...。如果有人愿意看...
现在原来的问题:
我不认为有可能做我想做的,但我问,以防万一......
我有一系列我想通过工厂创建的模板类。我使用工厂的原因是工厂有一些数据成员用于初始化通过该工厂创建的每个类。
例如,让我们考虑这个类:
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 operator()(P1 p1, P2 p2, P3 p3, P4 p4)”行产生以下错误:
错误 C2065:“P1”:未声明的标识符
因为像“DoSomething”这样的类只有一个声明(DoSomething 将始终使用 < int, float >),我认为我可以使用模板参数推导,并最终得到如下语法:
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*/);
但这是多余的,不是很优雅......