C++特征问题

dul*_*uli 8 c++ traits

我有一个模板课

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类的模板参数传递?

Kir*_*sky 7

您可以将类的一部分专门化,如下所示:

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*以这种方式类型.