gpt4 book ai didi

c++ - 为什么在实现 header 中定义的模板化函数和类时使用 "tpp"文件?

转载 作者:可可西里 更新时间:2023-11-01 16:26:33 33 4
gpt4 key购买 nike

请引用this question about implementing templates.中第一个答案

具体来说,请注意这句话

A common solution to this is to write the template declaration in a header file, then implement the class in an implementation file (for example .tpp), and include this implementation file at the end of the header.

我把我最感兴趣的部分加粗了。
.tpp 文件有什么意义?我尝试完全按照该页面中的建议进行操作并且它起作用了。但是后来,我将文件扩展名更改为任何随机乱码(如 .zz 或 .ypp),它仍然有效!它应该工作吗?它是 .tpp 还是任何其他扩展名有关系吗?为什么不使用 .cpp?

这是我感到困惑的另一件事。
如果我的实现是用 .cpp 编写的,并且 header 定义了非模板函数,那么我只需要编译一次 .cpp 文件,对吗?至少在我更改 .cpp 文件中的某些内容之前。

但是如果我有一个定义模板函数的头文件并且我的实现在一个带有随机时髦扩展名的文件中,它是如何编译的?每次我编译 #include 所述 header 的任何源代码时,这些实现是否编译?

最佳答案

Does it matter if it's .tpp or any other extension? And why not use a .cpp?

扩展名是什么并不重要,但不要使用 .cpp 因为它违反约定(它仍然可以工作,但不要这样做;.cpp 文件一般是源文件)。除此之外,这取决于您的代码库使用什么。例如,我(和 Boost 代码库)为此目的使用 .ipp

What's the significance of a .tpp file?

当您不希望包含模块接口(interface)的文件包含所有血淋淋的实现细节时使用它。但是您不能在 .cpp 文件中编写实现,因为它是一个模板。所以你会尽力而为(不考虑显式实例化等)。例如

Something.hpp

#pragma once

namespace space {

template <typename Type>
class Something {
public:
void some_interface();
};

} // namespace space

#include "Something.ipp"

Something.ipp

#pragma once

namespace space {

template <typename Type>
void Something<Type>::some_interface() {
// the implementation
}

} // namespace space

I thought the whole point of writing definitions in headers and the implementations in a separate file is to save compilation time, so that you compile the implementations only once until you make some changes

您不能将通用模板代码拆分到一个实现文件中。您需要完整的代码可见才能使用模板,这就是为什么您需要将所有内容都放在头文件中的原因。有关更多信息,请参阅 Why can templates only be implemented in the header file?

But if the implementation file has some funky looking file extension, how does that work in terms of compiling? Is it as efficient as if the implementations were in a cpp?

您不编译.tpp.ipp-inl.h 等文件。它们就像头文件一样,只是它们只被其他头文件包含。您只编译源文件(.cpp.cc)文件。

关于c++ - 为什么在实现 header 中定义的模板化函数和类时使用 "tpp"文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44774036/

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