我对模板化成员函数有点困惑,假设我们有一些带有模板化成员函数的奇怪结构,如下所示:
struct Foo
{
template <typename T> void f(T t) {};
};
然后,我们将该结构存储到一些标准容器中:
std::vector<Foo> V;
V.push_back(Foo());
V.push_back(Foo());
V.push_back(Foo());
V.push_back(Foo());
下一个; 让我们调用模板化成员函数的不同实例:
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);
最后,问题:
¿ Foo 类的所有实例都来自同一个类?似乎答案是肯定的,但是......第一个 Foo 实例最后有两个 f 成员函数的重载:
[0] Foo::f(int t);
[0] Foo::f(char t);
另一方面,其他 Foo 实例似乎只有一个版本的 f 函数。显然,由于成员函数的差异,每个实例的基本类型是不同的。
[1] Foo::f(float t);
[2] Foo::f(double t);
[3] Foo::f(long t);
¿ f 函数在哪里被实例化?显然我们只能从第一个 Foo 实例中获取 Foo::f(int t) 函数的地址,因为该函数只属于该实例;其他功能相同。
提前致谢。