gpt4 book ai didi

c++ - 无法推断返回类型的模板参数

转载 作者:行者123 更新时间:2023-11-30 04:58:56 25 4
gpt4 key购买 nike

我正在尝试使用 std::function 创建一个抽象工厂

一个普通的工厂工作正常,但是当我想返回一个工厂(另一个 std::function)而不是一个对象时,我得到以下错误:

/home/nikolai/Projects/cpplearn/AbstractFactoryPattern/Main.cpp:9:45: error: no matching function for call to ‘factoryProducer(const char [6])’
auto shapeFactory = factoryProducer("shape")();
^
In file included from /home/nikolai/Projects/cpplearn/AbstractFactoryPattern/Main.cpp:3:
/home/nikolai/Projects/cpplearn/AbstractFactoryPattern/AbstractFactory.hpp:48:1: note: candidate: ‘template<class ReturnType> ReturnType abstractfactory::factoryProducer(const string&)’
factoryProducer(const std::string& tag = {})
^~~~~~~~~~~~~~~
/home/nikolai/Projects/cpplearn/AbstractFactoryPattern/AbstractFactory.hpp:48:1: note: template argument deduction/substitution failed:
/home/nikolai/Projects/cpplearn/AbstractFactoryPattern/Main.cpp:9:45: note: couldn't deduce template parameter ‘ReturnType’
auto shapeFactory = factoryProducer("shape")();

我定义工厂如下:

namespace factory 
{

/**
* A template for a factory, which is just a std::function.
* See AnimalFactory.hpp for example usage.
*/
template <class ReturnType, class ...Args>
using Factory = std::function<ReturnType(Args...)>;

}

工厂生产者工作正常,除了最后一个,我试图创建一个工厂工厂并且返回类型必须是动态的:

namespace abstractfactory 
{

using ShapeFactory = factory::Factory<std::unique_ptr<Shape>>;
using ColorFactory = factory::Factory<std::unique_ptr<Color>>;

ShapeFactory shapeFactoryProducer(const std::string& tag = {})
{
return [=]
{
if(tag == "rectangle")
return std::unique_ptr<Shape>(new Rectangle());
else if(tag == "circle")
return std::unique_ptr<Shape>(new Circle());
else if(tag == "square")
return std::unique_ptr<Shape>(new Square());
else
return std::unique_ptr<Shape>(nullptr);
};
}

ColorFactory colorFactoryProducer(const std::string& tag = {})
{
return [=]
{
if(tag == "green")
return std::unique_ptr<Color>(new Green());
else if(tag == "blue")
return std::unique_ptr<Color>(new Blue());
else if(tag == "red")
return std::unique_ptr<Color>(new Red());
else
return std::unique_ptr<Color>(nullptr);
};
}

template <class ReturnType>
ReturnType
factoryProducer(const std::string& tag = {})
{
return [=]
{
if(tag == "shape")
return shapeFactoryProducer;
else if(tag == "color")
return colorFactoryProducer;
else
return [=] {};
};
}

}

如何为函数 factoryProducer 实现动态返回类型?

编辑:新代码(仍然不起作用):

struct FactoryType {};
struct ShapeType {};
struct ColorType {};

template <class TFactory, class ReturnType>
ReturnType factoryProducer(TFactory tag)
{
return [=]
{
if constexpr (std::is_same<TFactory, ShapeType>::value)
return shapeFactoryProducer;
else if constexpr (std::is_same<TFactory, ColorType>::value)
return colorFactoryProducer;
};
}

auto shapeFactoryProducer = factoryProducer(ShapeType());

最佳答案

您的返回类型推导语法偏离标记。这是正确的(需要 C++17)。

template <class TFactory>
auto factoryProducer(TFactory tag)
{
if constexpr (std::is_same<TFactory, ShapeType>::value)
return shapeFactoryProducer;
else if constexpr (std::is_same<TFactory, ColorType>::value)
return colorFactoryProducer;
}

关于c++ - 无法推断返回类型的模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51463753/

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