我有一个模板课
template <typename Data>
class C
{
.....
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,我依靠编译器让我替换数据类型.我在Data类型的对象上调用方法foo(),goo(),因此我需要提供的方法.
我现在需要用int和string替换我的Data类型.我不想专门化,因为类已经太大了,需要专门化每个方法(只需要很少的代码更改).
我的选择(请告诉我是否有更多)
1)我可以提供int和string的包装类,它们实现方法foo(),goo()等
2)提供一个traits类特性,在提供foo(),goo()(这些是我目前的可替代类)的类的对象上调用foo()或goo(),并为int和string专门化这些类.
问题
1)1 vs 2的相对优点是什么?
2)我的特质类将具有静态方法.traits类也可以使用非静态方法吗?我看到大多数traits类在STL中定义常量.
3)我是否将traits类设为全局类,还是应该将它们作为C类的模板参数传递?
您可以将类的一部分专门化,如下所示:
template <typename Data>
class C
{
void foo();
// lot of other stuff
};
// specialize part of class C
// (some members of a class C will have specific
// implementation for specific types)
template<> void C<int>::foo() { std::cout << "int" << std::endl; }
template<> void C<std::string>::foo() { std::cout << "string" << std::endl; }
// same for goo
Run Code Online (Sandbox Code Playgroud)
上面的语法由C++标准14.7/3和14.5.2/2允许.没有必要C多次重写课堂上的所有内容.
请注意,不允许以这种方式部分地专门化模板类.举例来说,你不能定义为不同的功能Data,并Data*以这种方式类型.
| 归档时间: |
|
| 查看次数: |
1731 次 |
| 最近记录: |