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

时间:2014-04-04 14:07:27

标签: c++ templates code-duplication

我四处寻找一个很好的解决方案,以避免模板类的每个特殊化时出现代码重复。

以下是一个示例代码:

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

现在默认定义:

template<class T>
C<T>::foo() { return 0; }

现在特殊模板的拼写

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 .... }

现在我必须复制spezailization的代码。但总的来说它是相同的代码。

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

亲切的问候, 彼得

2 个答案:

答案 0 :(得分:2)

避免重复代码的一种方法是使用基类来处理泛型实现:

template <class T>
class base_C
{
    void generic_foo(){...}
};

template <>
class C <SpecialType> : base_C<SpecialType>
{
    void foo()
    {
        SpecialType::custom_foo();
        base_C<SpecialType>::generic_foo();
    }
};

这个想法要求将foo分成更通用的部分并将它们放入base_C。有了这个,C::foo的每个专业化都将拥有最少量的自定义代码。

答案 1 :(得分:2)

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

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 .... }
  

我该如何隐藏实现?也许通过使用noname-namespace或impl-namespace?

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

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