具有模板化成员函数的类,是同一类?

Pap*_*ter 2 c++ templates

我对模板化的成员函数有点困惑,让我们假设我们有一些带有模板化成员函数的奇怪结构,如下所示:

struct Foo
{
    template <typename T> void f(T t) {};
};
Run Code Online (Sandbox Code Playgroud)

然后,我们将该结构存储到一些标准容器中:

std::vector<Foo> V;

V.push_back(Foo());
V.push_back(Foo());
V.push_back(Foo());
V.push_back(Foo());
Run Code Online (Sandbox Code Playgroud)

下一个; 让我们调用模板化成员函数的不同实例:

V.at(0).f<int>(1);
V.at(0).f<char>(2);
V.at(1).f<float>(3.4f);
V.at(2).f<double>(5.6);
V.at(3).f<long>(7);
Run Code Online (Sandbox Code Playgroud)

最后,问题是:

¿Foo类的所有实例都来自同一个类?似乎答案是肯定的但是......第一个Foo实例最后有两个f成员函数的重载:

[0] Foo::f(int t);
[0] Foo::f(char t);
Run Code Online (Sandbox Code Playgroud)

而另一方面,其他Foo实例似乎只有一个版本的f函数.因此,由于成员函数的差异,每个实例的基本类型显然是不同的.

[1] Foo::f(float t);
[2] Foo::f(double t);
[3] Foo::f(long t);
Run Code Online (Sandbox Code Playgroud)

¿f函数在哪里实例化?显然我们只能从第一个Foo实例获取Foo :: f(int t)函数的地址,因为该函数只属于该实例; 其他功能相同.

提前致谢.

Aka*_*ksh 7

所有重载都是由编译器为Foo::f成员函数生成的,您可以将其视为已手动编写所有这些重载.

重载生成(模板实例化)不是基于实例的,而是基于类,类本身获取所有模板实例化splatted(就像在类的主体中编写了不同类型的所有重载一样,对于给定的T型)

所以这在你的情况下:

struct Foo 
{     
   template <typename T> void f(T t) {}; 
}; 
Run Code Online (Sandbox Code Playgroud)

将成为(概念上)

struct Foo 
{     
   void f<int>(int t) {}; 
   void f<char>(char t) {}; 
   void f<float>(float t) {}; 
   ...
   /// all the other uses of f with different types, anywhere in your code.
}; 
Run Code Online (Sandbox Code Playgroud)

这是人们反对模板的原因之一,它被称为"代码膨胀".