2014-04-04 40 views
2

我四处寻找一个很好的解决方案,以避免每个模板类的spezialization上的代码重复。避免多重C++模板spezialization上的代码重复

下面是一个例子代码:

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现在我不得不重复代码为spezilization。但通常它是相同的代码。

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

亲切的问候, 彼得以避免重复代码使用一个基类来处理通用实现

回答

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命名空间或impl命名空间?

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

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

+0

是否也可以将bar()隐藏在头文件中的未命名名称空间内? – Peter

+0

@Peter不幸的是不适用于模板。匿名(未命名)命名空间与它们所在的编译单元相关并且是私有的。由于模板类没有(主)编译单元,恐怕这是行不通的。 –

1

方式一:

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(); 
    } 
}; 

的想法begind这是foo分裂成更通用的部件和把它们放入base_C。有了这个C::foo的每个专业化将有一个最小量的自定义代码。