避免多个 C++ 模板专业化上的代码重复

Pet*_*ter 5 c++ templates code-duplication

我四处寻找一个好的解决方案,以避免模板类的每个专业化上的代码重复。

这是一个示例代码:

template<class T>
class C
{
    int foo();
}
Run Code Online (Sandbox Code Playgroud)

现在默认值的定义:

template<class T>
C<T>::foo() { return 0; }
Run Code Online (Sandbox Code Playgroud)

现在特殊模板的专业化

template<> C<int>::foo()    { ... do a lot of stuff and return n .... }
template<> C<double>::foo() { ... do a lot of stuff and return n .... }
template<> C<int>::foo()    { ... do a lot of stuff and return n .... }
Run Code Online (Sandbox Code Playgroud)

现在我必须复制专门化的代码。但总的来说,它是相同的代码。

我的问题是:避免代码重复的最佳解决方案是什么以及如何隐藏实现?也许通过使用 noname-namespace 或 impl-namespace ?

亲切的问候,彼得

πάν*_*ῥεῖ 4

您可以像处理任何其他类一样:将样板代码提取到模板类中的另一个(私有)函数,并在您的专业化中调用此函数。

template<class T>
class C
{
    int foo();

    void bar() { /* does lot of stuff ... */ }
};

template<> int C<int>::foo() { bar(); return n .... }
template<> int C<double>::foo() { bar(); return n .... }
Run Code Online (Sandbox Code Playgroud)

我怎样才能隐藏实施?也许通过使用 noname-namespace 或 impl-namespace ?

通过拥有特定于编译单元的未命名命名空间来隐藏模板代码的实现实际上是不可能的。

如果您的主要目的是获得更清晰可读的模板头文件,您可以将实现分解到另一个包含文件中。这些通常被命名为.tcc.icc,大多数 C++ 实现标准头文件中都有该技术的示例。