【问题标题】:Take a reference to a class template'd on any type引用任何类型的类模板
【发布时间】:2010-12-19 17:11:19
【问题描述】:

我正在编写 C++ 代码,它引用依赖于特定硬件、固件和驱动程序的类。我想删除接口进行测试,但是有一些障碍让我很困惑。我与之交互的类是自动生成的(不是我的想法),所以我不能让它从定义接口的基类继承。我需要调用的方法不是虚拟的,因此我的测试存根不能从它继承并覆盖这些方法。

我突然想到,我可以创建一个模板化的包装类,然后将调用重定向到输入它的类。我会有类似的东西......

template< class T >
class DriverInterface
{
    public:
        DriverInterface( T& driverImpl ):
        m_driverImpl( driverImpl )
        {
        }

        virtual ~DriverInterface( void )
        {
        }

        virtual void GetDataBuffer( char *&pData, int &bufLen )
        {
            m_driverImpl.GetDataBuffer( pData, bufLen );
        }

        virtual void WriteDataBuffer( char *pData, int bufLen )
        {
            m_driverImpl.WriteDataBuffer( pData, bufLen );
        }
    protected:
        T& m_driverImpl;

    private:
};

class DriverWriter
{
    public:
        DriverWriter( DriverInterface& driverInterface );
    //etc
}

不幸的是,编译器希望我在 DriverWriter 类的 DriverInterface 上指定类型参数。有没有办法重组代码,这样我就不需要指定类型了?

【问题讨论】:

    标签: c++ templates pass-by-reference


    【解决方案1】:

    解决这个问题的常用方法是将虚函数分解到它们自己的不依赖模板参数的接口中:

    class DriverInterfaceBase
    {
        public:
            virtual ~DriverInterfaceBase( void ) { }
    
            virtual void GetDataBuffer( char *&pData, int &bufLen ) = 0;
            virtual void WriteDataBuffer( char *pData, int bufLen ) = 0;
    };
    
    // Derive from it:
    template< class T >
    class DriverInterface : public DriverInterfaceBase
    

    然后你就可以写了

    class DriverWriter
    {
        public:
            DriverWriter( DriverInterfaceBase& driverInterface );
        //etc
    };
    

    【讨论】:

    • 谢谢。现在似乎很明显,但我当然看不到解决方案。
    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多