我四处寻找一个很好的解决方案,以避免模板类的每个特殊化时出现代码重复。
以下是一个示例代码:
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?
亲切的问候, 彼得
答案 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 ++实现标准头文件中都有此技术的示例。