代码之家  ›  专栏  ›  技术社区  ›  J. Daniel

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

  •  1
  • J. Daniel  · 技术社区  · 7 年前

    我试图使用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());
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   n. m. could be an AI    7 年前

    你的返回类型演绎语法太离谱了这里是正确的(需要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;
    }