C ++特征问题

时间:2010-06-10 20:13:16

标签: c++ traits

我有一个模板类

template <typename Data>
class C
{
.....
}

在大多数情况下,我依赖编译器让我替换数据类型。 我在Data类型的对象上调用方法foo(),goo(),所以我需要提供替代方法 那。

我现在需要用int和string替换我的Data类型。我不想专攻 因为该类已经太大而且需要专门化每个方法(只需要很少的代码更改)。

我的选择(请告诉我是否有更多)

1)我可以提供int和string的包装类,它们实现方法foo(),goo()等

2)提供特质课程 在提供foo(),goo()的类的对象上调用foo()或goo()的traits (这些是我目前可替代的课程) 并为int和string专门化这些类。

问题

1)1 vs 2的相对优点是什么?

2)我的特质类将有静态方法。 traits类也可以使用非静态方法吗?我看到大多数traits类在STL中定义常量。

3)我是否将traits类设为全局,还是应将其作为模板参数传递 对于C级?

3 个答案:

答案 0 :(得分: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

C ++ Standard 14.7 / 3和14.5.2 / 2允许的上述语法。没有必要多次重写类C中的所有内容。

请注意,不允许以这种方式部分特化模板类。例如,您无法以这种方式为DataData*类型定义不同的函数。

答案 1 :(得分:2)

  

1)1 vs 2的相对优点是什么?

内置插件的包装使C变得简单。特征保留内置插件内置插件。 :)
您还可以尝试将根据Data而不同的代码分解为基类模板并将其专门化。

  

2)我的特质类将有静态方法。 traits类也可以使用非静态方法吗?我看到大多数traits类在STL中定义常量。

如果它有状态,我甚至不确定它仍被称为“特征” FWIW,我通常将特征归类为那些将信息分解为其他类型的特征。谈到行为,我宁愿称之为政策。但是,我确实看到std::char_traits不符合这些定义。 :( 无论如何,如果它有非静态成员,那么它有状态,我不会再称这个特征了。

  

3)我是否将traits类设为全局类,还是应该将它们作为C类的模板参数传递?

将其作为模板参数传递只会让您想要C的用户为Data传递的内容提供自己的特征。如果int总会有一个特征模板,那么该类就可以使用它。如果用户可能会为int提出自己的特征,则需要一种方法将其传递给C

答案 2 :(得分:0)

每个半打?我不知道任何先验理由在一般意义上使用一个与另一个。没有你问的问题让我觉得你应该选择一个而不是另一个。我能想到的唯一一件事就是选择1可能需要对现有函数进行较少的更改。另一方面,客户端将无法在不创建包装器的情况下仅使用基元上的函数。

这真的是细节问题而你没有提供它们。