Как я могу подделать класс шаблонными методами без перекомпиляции? - PullRequest
0 голосов
/ 22 декабря 2018

Я хочу подделать (то есть обменяться с тестовой реализацией) класс следующим образом:

class Foo {
public:
   ...
   template <typename T> void Bar(T& baz);
   ...
}

В настоящее время я достигаю этого, создав несвязанный класс с тем же интерфейсом:

class FakeFoo {
public:
   ...
   template <typename T> void Bar(T& baz);
   ...
}

И поменять местами класс, используемый в кодовой базе, с помощью макроса:

#ifdef USE_FAKE_FOO
using ClientFoo = FakeFoo;
#else
using ClientFoo = Foo;
#endif

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

Есть ли какой-либо способ, которым я могуобойти это?

ПРИМЕЧАНИЕ: шаблонирование кода, использующего Foo, работает, но я не хочу требовать, чтобы весь клиентский код делал это только для того, чтобы тесты можно было легко запускать.

1 Ответ

0 голосов
/ 22 декабря 2018

Вы просто не можете сделать это с помощью шаблонного кода.

C ++ должен скомпилировать все, прежде чем вы получите свой исполняемый файл.«Поздние» модификации без перекомпиляции невозможны.Если у вас есть определенный интерфейс, вы можете обмениваться библиотеками с тестируемыми, но никогда не использовать шаблонный интерфейс, если типы вызовов различны.

Таким образом, вы должны перенаправить свой вызов с помощью какого-либо вызова библиотеки, но этоне будет работать с разными экземплярами шаблона.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...