【问题标题】:avoid code duplication on multiple c++ template spezialization [duplicate]避免在多个 C++ 模板专业化上重复代码 [重复]
【发布时间】:2014-04-04 14:07:26
【问题描述】:

我四处寻找一个好的解决方案来避免模板类的每个特殊化的代码重复。

这是一个示例代码:

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

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

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

亲切的问候, 彼得

【问题讨论】:

    标签: c++ templates code-duplication


    【解决方案1】:

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

    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++ 实现标准头文件中都有这种技术的示例。

    【讨论】:

    • 是否也可以将 bar() 隐藏在头文件内的未命名命名空间内?
    • @Peter 不幸的是,不适用于模板。匿名(未命名)命名空间与它们所在的编译单元相关并且是私有的。由于模板类没有(主)编译单元,恐怕这行不通。
    【解决方案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 的每个特化都将拥有最少的自定义代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多