参考任何类型的类模板

eff*_*ish 2 c++ templates pass-by-reference

我正在编写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
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,编译器要我在DriverWriter类的DriverInterface上指定一个类型参数.有没有办法重构代码,以便我不需要指定类型?

Joh*_*itb 7

解决它的一种常用方法是将虚函数分解为自己的接口,而不依赖于模板参数:

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
Run Code Online (Sandbox Code Playgroud)

然后你可以写

class DriverWriter
{
    public:
        DriverWriter( DriverInterfaceBase& driverInterface );
    //etc
};
Run Code Online (Sandbox Code Playgroud)