gpt4 book ai didi

c++ - 隐式特化模板类而不使用 <>

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:54 24 4
gpt4 key购买 nike

我正在使用模板从代码库中提取依赖项。这样做时,新类现在是模板类。我想像以前一样初始化它们。否则,在进行测试之前,我将不得不接触部分生产代码。

这是一个最小的例子:

#include <iostream>
using namespace std;

//OLD SOURCE
class LogUser_Old
{
public:
void print() { cout << "LogUser Old" << endl; }
};

//NEW SOURCE
struct normal
{
static void log(const char * out) { cout << out << endl; }
};

struct injected
{
static void log(const char * out) { cout << "injected '" << out << "'" << endl; }
};

template< typename output = normal>
class LogUser_New
{
public:
void print() { output::log("LogUser New"); }
};

int main()
{
//OLD Production Code
LogUser_Old lo;
lo.print();
//New Production Code
LogUser_New<> ln; //THE <> is a change in Production code
ln.print();
//Testcode
LogUser_New<injected> ln_silent;
ln_silent.print();
return 0;
}

在这里LogUser被重写为可注入(inject)。 _Old标记旧状态_New标记新状态。以前用于实例化类的生产代码必须从 LogUser user; 更新至 LogUser<> user; .

有没有办法让编译器隐含地弄清楚他可以在这里使用空模板案例,以便生产代码可以保持与以前一样?

最佳答案

是的,使用typedef:

template< typename output = normal>
class LogUser_New_tmpl
{
public:
void print() { output::log("LogUser New"); }
};

typedef LogUser_New_tmpl<> LogUser_New;

如果你有 C++11,你当然可以使用 using 而不是 typedef:

using LogUser_New = LogUser_New_tmpl<>;

关于c++ - 隐式特化模板类而不使用 <>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33653407/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com