如何在不重新编译的情况下使用模板化方法伪造一个类?

时间:2018-12-22 10:07:01

标签: c++ c++11

我想伪造(例如与测试实现交换)这样的类:

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来为不同的测试实现不同的功能时,我必须为希望使用的每个特定FakeFoo重新编译代码库。

有什么办法可以解决这个问题?

注意:模板化使用Foo的代码确实可以工作,但我不想要求所有客户端代码都可以这样做,只是为了可以更轻松地运行测试。

1 个答案:

答案 0 :(得分:2)

使用模板代码根本无法做到这一点。

C ++需要先编译所有内容,然后才能获取可执行文件。没有重新编译的“最新”修改是不可能的。如果您具有已定义的接口,则可以与测试库交换库,但是如果调用的类型不同,则不能与模板化接口交换库。

因此,您必须通过某种库调用来间接调用,但这不适用于其他模板实例。

如果可以重新链接而不进行编译,也可以使用两次相同的名称和签名进行函数调用,以交换链接在一起的文件。但这仅在您的代码使用与模板代码不兼容的调用相同的接口时才有效。