模板成员函数如何在c++中工作

How do template member functions work in c++?

本文关键字:c++ 工作 成员 函数      更新时间:2023-10-16

我想知道模板成员函数是如何工作的。特别是,当存在模板成员函数的实例化时,是否重新定义了整个类?我的困惑来自这样一个事实:(如果我是对的)模板类不是正确意义上的类。即,当被实例化时,编译器为一个全新的类创建定义。模板函数也是如此。然而,带有template函数的类似乎是实际的类,所以我不确定它们是如何工作的。因此,我想知道,在实例化一个模板成员函数之后,类定义会发生什么?此外,如果我将带有模板成员函数的类传递给模板类,我可以使用模板成员函数吗?这会造成问题吗?我试过一次,但出现了一个错误,说有几个函数定义了不止一次,尽管我不确定这是原因还是我的错误可能有其他原因。在使用静态模板成员函数时,是否有任何进一步的警告?

类定义保持原样;template函数所做的就是为该类生成一系列成员函数。例如:

class A {
    public:
        template<typename T> foo (T &t);
}

在概念上与你写的没有什么不同:

class A {
    public:
        foo (bool &t);
        foo (int &t);
        foo (double &t);
}

只是更方便。在最后一个例子中,你不会期望为每个函数创建一个新的类,是吗?

也许这种混淆源于函数在某种程度上是类内存布局的一部分;每个函数本身都包含在类中,并且每当创建类的对象时,都会在内存中的某个位置实例化。这种观点是不正确的。函数(模板化的、全局的、成员的、lambda或其他)从来不会在运行中创建或在内存中复制;它们是可执行映像中静态且不变的部分。类的内存布局不会因为存在一组额外的函数而改变,即使这些函数恰好是由模板成员生成的。

当您实例化一个类时,会实例化模板类定义。它的每个成员函数在使用时都被实例化。这实际上允许您拥有成员函数,如果在使用某些类型而不是其他类型实例化类时调用这些成员函数,则这些成员函数将不起作用。但是,您必须确保函数的签名在语法上是可行的,或者在SFINAE中失败。它将在解析的第一阶段进行查找。如果函数本身不是一个模板,则将检查主体的名称查找。。。因此,依赖名称必须通过typename进行标记。