gpt4 book ai didi

c++ - 在函数调用中使用模板模板参数

转载 作者:行者123 更新时间:2023-11-28 03:33:11 24 4
gpt4 key购买 nike

实际上,所有的答案都很好,而且内容丰富,但它们并没有解决我的特定问题。我认为这不是那些非常乐于助人的人的错,而是我的问题措辞不当。因此,我决定在这里发布一个包含更多相关代码示例的全新问题: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)”行产生以下错误:

error C2065: 'P1' : undeclared identifier

因为像“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*/);

但是那是多余的而且不是很优雅...

最佳答案

尝试以下操作:

struct UndoableCommand { };

template <
template <typename P1, typename P2> class CommandType,
typename P1a, typename P2a
>
void createCommand(P1a p1, P2a p2)
{
UndoableCommand *cmdPtr = new CommandType<P1a,P2a>(p1, p2);
}

template <typename P1, typename P2> class MyCommand : public UndoableCommand
{
public:
MyCommand(P1, P2) { }
};

int main()
{
createCommand<MyCommand>(1, 2.0);
}

它编译于:http://ideone.com/tEWR5

关于c++ - 在函数调用中使用模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11955859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com