Можно ли написать шаблон класса C++, который автоматически оборачивает и виртуализирует не виртуальные интерфейсы?

Эта проблема

При написании юнит-тестов часто нужны фиктивные объекты. Чтобы сделать заменяемый объект proccution, класс фиктивного объекта происходит от класса производственного объекта и переопределяет некоторые виртуальные функции.

Проблема возникает, когда у производственного класса нет виртуальных функций, и вы не можете это изменить. Сейчас я вижу два варианта решения проблемы.

  1. Превратите свой класс в шаблон класса, параметризованный типом подсистем. Ваш производственный класс будет MyClass<ProductionSubsystem> и для испытаний на использование MyClass<MockSubsystem>

  2. Вручную напишите оболочку с виртуальной функцией, которая вызывает не виртуальные функции класса обернутой подсистемы. Тогда издевайтесь над оберткой.

Я не совсем доволен ни одним из двух вариантов. 1 вынуждает меня превратить мой "простой" класс в шаблон класса, а 2 вынуждает меня писать много кода для котла.

Поэтому мне было интересно, можно ли автоматизировать процесс написания оболочки для не виртуального класса. Я представляю что-то вроде этого:

// The subsystem that contains the production code
class Interface
{
    void nonVirtualFunction();
}

// Contains the same functions as Interface but does not derive from it
class Implementation
{
    void nonVirtualFunction();
};

// wrapper base class that provides the virtual interface
template<typename Interface>
class AutoWrapper
{
    // Do some magic to provide the same functions that Interface has, but virtual.
}

// Class to provide the interface of AutoWrapper<Interface> but calls the functions in Implentation.
template<typename Implementation, template Interface>
class AutoWrapperImpl 
{ 
    // do some other magic here ... 
};

Эта настройка должна разрешать следующий вариант использования:

// code using the AutoWrapper
void useAutoWrapper()
{
    AutoWrapper<Interface> wrapper = new AutoWrapper<Interface>();
    wrapper->nonVirtualFunction();    // calls Interface::nonVirtualFunction()

    wrapper = new AutoWrapperImpl<Interface,Implementation>();
    wrapper->nonVirtualFunction();    // calls Implementaion::nonVirtualFunction()
}

Вопрос

Возможно ли в C++ реализовать два класса AutoWrapper и AutoWrapperImpl? Если это так, как это делается и есть ли общедоступное решение?

0 ответов

Другие вопросы по тегам