类模板与成员模板

class template vs. member template

本文关键字:成员      更新时间:2023-10-16

什么时候使用类模板而不是使用成员模板有没有一个好的规则?据我了解,如果您的类包含成员变量模板,您将被迫使用类模板,但除此之外,您可以自由选择,因为:

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

行为如下:

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

我的主张有误吗?或者有什么经验法则什么时候使用什么?

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

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

被调用的函数是 someMethod(int)

第二个:

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

被调用的函数是 someMethod(char)

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

  1. 就像你说的,如果你有一个类型T的成员变量,你的类需要是一个模板。
  2. 如果你有一个返回T的函数不接受T,并且你不想在每次调用中手动指定类型,你的类需要是一个模板。
  3. 如果你需要一个依赖于T的虚函数,你的类需要是一个模板。
  4. 如果你需要每个实例化不同的类布局(即成员变量T,你的类需要是一个模板。
  5. 如果您需要确保函数都对单个类型进行操作,而不是任意生成它们的不同版本,则您的类需要是一个模板。

最好的经验法则是使用最简单的有意义的东西。通常,成员函数模板往往更为罕见,对于您正在谈论的用例来说几乎不存在。也许这不是巧合。