8

我有一个模板类

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

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

我现在需要用 int 和 string 替换我的 Data 类型。我不想专门化,因为这个类已经太大了,需要专门化每种方法(只需少量代码更改)。

我的选择(如果还有更多,请告诉我)

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

2) 提供一个特征类特征,该特征在提供 foo()、goo() 的类的对象上调用 foo() 或 goo()(这些是我目前的可替代类),并将这些类专门用于 int 和 string。

问题

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

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

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

4

3 回答 3

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++ 标准 14.7/3 和 14.5.2/2 允许的上述语法。无需C多次重写课堂上的所有内容。

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

于 2010-06-10T20:22:05.343 回答
2

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

内置插件的包装器保持C简单。特征保持内置内置插件。:)
您还可以尝试将不同的代码Data分解到基类模板中并对其进行专门化。

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

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

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

将其作为模板参数传递仅意味着您希望用户C为他们传入的任何内容提供自己的特征Data。如果该类总是有一个特征模板,int则可以使用它。如果用户可能想出自己的特征int,他们需要一种方法将其传递给C.

于 2010-06-10T20:16:02.707 回答
0

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

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

于 2010-06-10T20:18:30.657 回答