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

C++ 如何在不重新编译的情况下用模板化方法伪造类?,c++,c++11,C++,C++11,我想伪造(即与测试实现交换)这样的类: class Foo { public: ... template <typename T> void Bar(T& baz); ... } 问题在于,我需要根据是否要运行测试重新编译代码库。更糟糕的是,当我有多个为不同测试实现不同功能的FakeFoos时,我必须为我希望使用的每个特定FakeFoo重新编译代码库 我有办法解决这个问题吗 注意:模板化使用Foo的代码确实有效,但我不想要求所有客户机代码都这样做,这样测试

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

class Foo {
public:
   ...
   template <typename T> void Bar(T& baz);
   ...
}
问题在于,我需要根据是否要运行测试重新编译代码库。更糟糕的是,当我有多个为不同测试实现不同功能的
FakeFoo
s时,我必须为我希望使用的每个特定
FakeFoo
重新编译代码库

我有办法解决这个问题吗


注意:模板化使用Foo的代码确实有效,但我不想要求所有客户机代码都这样做,这样测试就可以更容易地运行。

模板化的代码根本无法做到这一点

在获得可执行文件之前,C++需要编译所有内容。不重新编译的“以后”修改是不可能的。如果您有一个已定义的接口,您可以与测试接口交换库,但如果调用的类型不同,则不能使用模板接口

因此,您必须通过某种库调用间接调用,但这对不同的模板实例不起作用


如果可以在不编译的情况下再次链接,还可以使用两次相同的名称和签名进行函数调用,并交换链接在一起的文件。但是,只有当您的代码使用与模板代码不兼容的调用相同的接口时,这也会起作用。

您无法使用模板代码

在获得可执行文件之前,C++需要编译所有内容。不重新编译的“以后”修改是不可能的。如果您有一个已定义的接口,您可以与测试接口交换库,但如果调用的类型不同,则不能使用模板接口

因此,您必须通过某种库调用间接调用,但这对不同的模板实例不起作用

如果可以在不编译的情况下再次链接,还可以使用两次相同的名称和签名进行函数调用,并交换链接在一起的文件。但是,只有当您的代码使用与模板化代码不兼容的调用相同的接口时,这种方法才有效

class FakeFoo {
public:
   ...
   template <typename T> void Bar(T& baz);
   ...
}
#ifdef USE_FAKE_FOO
using ClientFoo = FakeFoo;
#else
using ClientFoo = Foo;
#endif