How to achieve “virtual template function” in C++

后端 未结 9 1649
囚心锁ツ
囚心锁ツ 2020-11-28 03:20

first off: I have read and I know now that a virtual template member function is not (yet?) possible in C++. A workaround would be to make the class a template and then use

9条回答
  •  一整个雨季
    2020-11-28 04:13

    I think the visitor pattern can be a solution.

    UPDATE

    I finished my example:

    #include 
    #include 
    #include 
    
    class Animal;
    class Wolf;
    class Fish;
    
    class Visitor
    {
        public:
        virtual void visit(const Animal& p_animal) const = 0;
        virtual void visit(const Wolf& p_animal) const = 0;
        virtual void visit(const Fish& p_animal) const = 0;
    };
    
    template
    class AmountVisitor : public Visitor
    {
        public:
        AmountVisitor(AMOUNT p_amount) : m_amount(p_amount) {}
        virtual void visit(const Animal& p_animal) const
        {
            std::cout << "I eat like a generic Animal." << std::endl;
        }
        virtual void visit(const Wolf& p_animal) const
        {
            std::cout << "I eat like a wolf!" << std::endl;
        }
        virtual void visit(const Fish& p_animal) const
        {
            std::cout << "I eat like a fish!" << std::endl;
        }
    
    
        AMOUNT m_amount;
    };
    
    class Animal {
        public:
    
            virtual void Accept(const Visitor& p_visitor) const
            {
                p_visitor.visit(*this);
            }
    
            virtual ~Animal() {
            }
    };
    
    class Wolf : public Animal {
        public:
            virtual void Accept(const Visitor& p_visitor) const
            {
                p_visitor.visit(*this);
            }
    };
    
    class Fish : public Animal {
        public:
            virtual void Accept(const Visitor& p_visitor) const
            {
                p_visitor.visit(*this);
            }
    };
    
    int main()
    {
        typedef boost::shared_ptr TAnimal;
        std::vector animals;
        animals.push_back(TAnimal(new Animal()));
        animals.push_back(TAnimal(new Wolf()));
        animals.push_back(TAnimal(new Fish()));
    
        AmountVisitor amount(10);
    
        for (std::vector::const_iterator it = animals.begin(); it != animals.end(); ++it) {
            (*it)->Accept(amount);
        }
    
        return 0;
    }
    

    this prints:

    I eat like a generic Animal.
    I eat like a wolf!
    I eat like a fish!
    

提交回复
热议问题