gpt4 book ai didi

C++ 模板和目标代码实例化

转载 作者:行者123 更新时间:2023-11-28 01:10:46 25 4
gpt4 key购买 nike

有了这个问题,我想更好地了解 C++ 模板系统如何处理 this question .

据我所知,基于模板的类和函数通常放在头文件中。这是由于管理通用数据类型的技术问题,其特征原则上是未知的。一旦知道它们,编译器就可以生成适合所需数据类型的可执行代码。

在头文件something.h中,我们的类定义如下:

template <typename T>
class Something
{
public:
void setElement (T &elem) {
element = elem;
}
T getElement () {
return element;
}
private:
T element;
};

现在让我们假设拆分源和类定义:

下面的类定义将写在something.h中:

template <typename T>
class Something
{
public:
void setElement (T &elem);
T getElement ();
private:
T element;
};

虽然下面的方法会写在something.cpp中:

#include "something.h"

template <typename T>
void Something<T>::setElement (T &elem)
{
element = elem;
}

template <typename T>
T Something<T>::getElement ()
{
return element;
}

除非我们在 something.cpp 中声明一些特定类型的实例,否则如果我们将其编译为目标文件,我们将不会获得其中的任何文本部分:

dacav@mithril:<tmp>$ g++ something.cpp  -c
dacav@mithril:<tmp>$ objdump -D something.o

something.o: file format elf64-x86-64


Disassembly of section .comment:

0000000000000000 <.comment>:
0: 00 47 43 add %al,0x43(%rdi)
3: 43 3a 20 rex.XB cmp (%r8),%spl
...
...
20: 34 2e xor $0x2e,%al
22: 31 00 xor %eax,(%rax)
dacav@mithril:<tmp>$

As Martin York shows我们可以强制编译器为某些特定的数据类型生成代码,以控制哪些类型可以使用,哪些不可以。但是如果我们不想要任何限制呢?

最佳答案

如果您希望能够为任意类型实例化一个模板,只需将实例化所需的所有内容放在头文件中即可。这意味着将函数体(需要实例化)放在头文件中,而不是放在 .cpp 文件中。

如果您希望在单独的文件中声明和定义只是为了更好地构建源代码,您可以使用这样的方案:

某事.h

// Just the declaration

template<typename T>
class Something {
void foo();
};

// include the header file with the definitons
#include "something.impl.h"

something.impl.h

// Put definitions here

template<typename T>
void Something<T>::foo() {
}

关于C++ 模板和目标代码实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3419265/

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