gpt4 book ai didi

c++ - 具有模板化成员函数的类,是同一个类吗?

转载 作者:太空狗 更新时间:2023-10-29 23:53:23 25 4
gpt4 key购买 nike

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

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) 函数的地址,因为该函数只属于该实例;其他功能相同。

提前致谢。

最佳答案

所有的重载都是由编译器为Foo::f 成员函数生成的,你可以认为它是手工写出来的。

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

所以你的情况是这样的:

struct Foo 
{
template <typename T> void f(T t) {};
};

将成为(概念上)

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.
};

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

关于c++ - 具有模板化成员函数的类,是同一个类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com