隐式专门化模板类而不使用<>

时间:2015-11-11 15:05:36

标签: c++ templates dependency-injection

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

这是一个最小的例子:

#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被重写为可注射的。 _Old标记旧状态_New标记新状态。用于实例化类的先前生产代码必须从LogUser user;更新为LogUser<> user;

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

1 个答案:

答案 0 :(得分:1)

是的,请使用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<>;