类模板与成员模板

时间:2016-02-16 20:18:46

标签: c++ templates

使用类模板而不是使用成员模板时是否有一个好的规则? 据我了解,如果您的类包含成员变量模板,您将被迫使用类模板,否则您可以自由选择:

template<typename T>
class Foo
{
public:
    void someMethod(T x);
};

表现得像这样:

class Foo
{
public:
    template<typename T>
    void someMethod(T x);
};

我的说法错了吗?或者在使用什么时有任何经验法则吗?

2 个答案:

答案 0 :(得分:3)

两者完全不一样。第一个:

Foo<int> f;
f.someMethod('a');

被叫函数是someMethod(int)

第二个:

Foo f;
f.someMethod('a');

被叫函数是someMethod(char)

答案 1 :(得分:1)

出于多种原因,您可以选择将您的类设为模板,而不是使用成员函数模板。假设您有一个模板参数T

  1. 就像你说的,如果你有T类型的成员变量,你的类需要是一个模板。
  2. 如果您的函数返回T而不接受T,并且您不想在每次调用中手动指定类型,则您的类必须是模板。
  3. 如果您需要依赖T的虚拟功能,则您的课程必须是模板。
  4. 如果您需要在T的每个实例中使用不同的类布局(即成员变量),则您的类必须是模板。
  5. 如果你需要确保你的所有功能都是单一类型而不是任意生成它们的不同版本,那么你的类需要成为一个模板。
  6. 最好的经验法则是使用最简单的事情。一般而言,成员函数模板往往更为罕见 - 并且几乎不存在您正在谈论的用例。也许这不是巧合。