我试图使用std::function创建一个抽象工厂
  
  
   一个普通的工厂可以正常工作,但是当我想返回一个工厂(另一个std::函数)而不是一个对象时,我会得到以下错误:
  
  /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());