Если вы действительно хотите издеваться над стандартной библиотекой, тогда самый простой (возможно, единственный) подход - правильно оформить код.То есть вместо непосредственного использования заголовков и std
пространства имен вам придется использовать промежуточное имя.
Поэтому придумайте пространство имен, назовите его mstd
.В вашем смоделированном режиме это будет ваше ложное пространство имен.В немокативном режиме это будет просто псевдоним std
.
. Для файлов заголовков вам следует избегать непосредственного включения стандартных заголовков, но использовать слой насмешки.Таким образом, вместо включения <map>
вы можете включить <mk-map>
.Этот заголовочный файл будет затем выбирать между стандартной библиотекой и вашей версией.Возможно, так:
#ifdef MOCK_MODE
#include "mock/map.hpp"
#else
#include <map>
#endif
Вы можете альтернативно указать другой путь включения для вашего компилятора, который предшествует стандартным библиотекам.Однако, поскольку вам все равно придется псевдоним пространства имен, вам все равно придется изменить весь ваш код - таким образом, эти специальные заголовки так же просто включить.
Это единственный способ, которым я могу это увидетьза работой.Обратите внимание, что использование LD_PRELOAD или любого другого метода библиотеки не будет работать: стандартная библиотека C ++ состоит из множества шаблонных классов и встроенных функций.Вы должны заменить их прямо во время компиляции.