polymorphic converters

摘自:http://sourceforge.net/p/vector-agg/mailman/vector-agg-general/?viewmonth=200403

1 问题

Hello,

in agg_path_storage.hpp we can read:

    // Still, sometimes we have to use converters that have one common=20=

base
     // class and their interface methods are virtual. There is such=20
base class
     // called pipe_conv. See agg_pipe_conv.h for details. In fact=20
there's only
     // wrappers that turn interface function into virtual. Every vertex=20=

source
     // class has this wrapper.

where is agg_pipe_conv.h ?

2回答
Actually there were those polymorphic converters, but later I decided not
support them. They are used rarely, but make extra dependencies to maintain and
care about. As an alternative, you can easily write your own polymorphic
wrapper. The advantage of the templates is that they doesn't exclude using
dynamic polymorphism. All they need is properly exposed interface syntactically
and semantically correct.

It can look like follows:

    class conv_polymorphic_base
    {
    public:
        virtual ~conv_polymorphic_base() {}

        virtual void rewind(unsigned path_id) = 0;
        virtual unsigned vertex(double* x, double* y) = 0;
    };



    template<class Converter>
    class conv_polymorphic_wrapper : public conv_polymorphic_base
    {
    public:
        conv_polymorphic_wrapper(conv_polymorphic_base& src) :
            m_conv(src) {}

        virtual void rewind(unsigned path_id) 
        { 
           return m_conv.rewind(path_id); 
        }

        virtual unsigned vertex(double* x, double* y)
        {
           return m_conv.vertex(x, y);
        }

        // This function is used to access the original converter
        // and to set necessary parameters in it.
        Converter<conv_polymorphic_base>& conv() { return m_conv; }

    private:
        Converter<conv_polymorphic_base> m_conv;
    };

This class template should fit the most of the converters, but not all of them.
For those that accept more than one tempalte arguments you will have to write a
modified version of this wrapper.


你可能感兴趣的:(converters,agg,Polymorphic)