gpt4 book ai didi

c++ - 带有 unique_ptr 的工厂模式

转载 作者:行者123 更新时间:2023-11-27 23:39:40 24 4
gpt4 key购买 nike

我有抽象类 Agent,很少有派生类:Predator、Prey 等。我想建立一个工厂,它给我 unique_ptr,我可以将其存储在基类的 vector 中。

问题是,当我有:

using creatorFunctionType = std::unique_ptr<Agent>(*)();

这部分没问题,但在 map 中我不能将 lambda 用于:

return std::make_unique<Predator>();

但是当我尝试使用模板时:

template <class T>
using creatorFunctionType = std::unique_ptr<T>(*)();

其余函数无法编译。我很确定,我错过了一些关于模板的重要信息,但不知道是什么。你能给我一些提示吗?

发布完整代码,可能会有帮助

代理工厂.h

#include "Interfaces/Agent.h"
#include "Enums.h"
#include <map>
#include <memory>

class AgentFactory
{
public:
template <class T>
using creatorFunctionType = std::unique_ptr<T>(*)();

AgentFactory();
std::unique_ptr<Agent> createAgent(Enums::AgentType agentType);
private:
void registerAgentType(Enums::AgentType agentType, creatorFunctionType
creatorFunction);

std::map<Enums::AgentType, creatorFunctionType> factoryRegister;
};

代理工厂.cpp

#include "AgentFactory.h"
#include "Predator.h"
#include "Prey.h"

AgentFactory::AgentFactory()
{
registerAgentType(Enums::AgentType::Predator, []() { return
std::make_unique<Predator>(); });
registerAgentType(Enums::AgentType::Prey, []() { return
std::make_unique<Prey>(); });
}

std::unique_ptr<Agent> AgentFactory::createAgent(Enums::AgentType
agentType)
{
if (auto it = factoryRegister.find(agentType); it !=
factoryRegister.end()) {
return it->second();
}

return nullptr;
}

void AgentFactory::registerAgentType(Enums::AgentType agentType,
creatorFunctionType creatorFunction)
{
factoryRegister.insert(std::pair<Enums::AgentType,
creatorFunctionType>(agentType, creatorFunction));
}

编译错误:

1>d:\predator-prey\predator-prey\agentfactory.h(15): error C2955: 'AgentFactory::creatorFunctionType': use of alias template requires template argument list
1>d:\predator-prey\predator-prey\agentfactory.h(10): note: see declaration of 'AgentFactory::creatorFunctionType'
1>d:\predator-prey\predator-prey\agentfactory.h(17): error C3203: 'creatorFunctionType': unspecialized alias template can't be used as a template argument for template parameter '_Ty', expected a real type
1>d:\predator-prey\predator-prey\agentfactory.cpp(14): error C2064: term does not evaluate to a function taking 0 arguments
1>d:\predator-prey\predator-prey\agentfactory.cpp(22): error C3203: 'creatorFunctionType': unspecialized alias template can't be used as a template argument for template parameter '_Ty2', expected a real type
1>d:\predator-prey\predator-prey\agentfactory.cpp(22): fatal error C1903: unable to recover from previous error(s); stopping compilation

最佳答案

creatorFunctionType定义为

using creatorFunctionType = std::unique_ptr<Agent>(*)();

creatorFunctionType是一个指向函数的指针,它期望返回 std::unique_ptr<Agent> 的函数.

但是,您的 lambda 表达式没有明确的返回类型,因此编译器将它们的返回类型推断为 std::unique_ptr<Predator>std::unique_ptr<Prey> ,分别基于他们的return声明。

非捕获 lambda 可以隐式转换为指向函数的指针,这正是您在这种情况下想要的,但是您的 lambda 不返回 std::unique_ptr<Agent> , 所以它们不能分配给 creatorFunctionType .类型根本不匹配。

您需要明确说明 lambda 的返回类型,以便它们匹配 creatorFunctionType 的正确签名期待,例如:

AgentFactory::AgentFactory()
{
registerAgentType(Enums::AgentType::Predator,
[]() -> std::unique_ptr<Agent> { return std::make_unique<Predator>(); }
);
registerAgentType(Enums::AgentType::Prey,
[]() -> std::unique_ptr<Agent> { return std::make_unique<Prey>(); }
);
}

使用上面的代码,lambdas 现在将返回 std::unique_ptr<Agent> , 满足什么 creatorFunctionType期望。和 return语句仍然按原样工作,因为 std::unique_ptr<T>可以用 std::unique_ptr<U> 初始化只要U源自 T ,自 Predator 以来在您的情况下是正确的和 Prey派生自 Agent .

关于c++ - 带有 unique_ptr 的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56366556/

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