我有一个模板类
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级?
答案 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
中的所有内容。
请注意,不允许以这种方式部分特化模板类。例如,您无法以这种方式为Data
和Data*
类型定义不同的函数。
答案 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可能需要对现有函数进行较少的更改。另一方面,客户端将无法在不创建包装器的情况下仅使用基元上的函数。
这真的是细节问题而你没有提供它们。