c++ - 引用任何类型的类模板

标签 c++ templates pass-by-reference

我正在编写 C++ 代码,该代码引用依赖于特定硬件、固件和驱动程序的类。我想去掉用于测试的接口(interface),但有几个障碍让我感到困惑。我连接的类是自动生成的(不是我的想法)所以我不能让它从定义接口(interface)的基类继承。我需要调用的方法不是虚拟的,因此我的测试 stub 无法继承它并覆盖这些方法。

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

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 上指定一个类型参数。有没有一种方法可以重构代码,这样我就不需要指定类型了?

最佳答案

解决它的一种常见方法是将虚函数分解到它们自己的不依赖于模板参数的接口(interface)中:

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
};

关于c++ - 引用任何类型的类模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484076/

相关文章:

c++ - 模板函数,如何发送不同的结构并根据类型创建 if/else 语句?

c++ - 如何接受可修改和不可修改的参数?

c++ - 如何在C++中通过引用返回 vector

c++ - S60 3rd ed Emulator 在 Windows 7 中启动后立即终止

c++ - 连接到自身的 POSIX 套接字客户端

c++ - 运算符的初始化列表和 RHS

c++ - 更改数组大小 C++

templates - thymeleaf :text - Put a text without removing HTML structures

C++ - 可访问性与可见性

python - 在python中的对象之间传递数据