gpt4 book ai didi

c++ - 用于实例化模板代码的显式习惯用法 - 不包括其源代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:48 30 4
gpt4 key购买 nike

在 C 和 C++ 中,函数、ADT 和类的一种非常常见的编码模式是:

  • 带有声明(类的函数)的头 .h 文件。
  • 包含实际代码的实现 .cpp 文件。

这些被编译成一个单独的对象(共享或不共享)。其他代码,使用声明的实体(让我们称之为“foo”),包括 foo.h 文件,单独编译,然后链接到 foo.o。

但是,对于模板化的 foo,这是不可能的:如果不指定所需实例化的类型,foo.o 是无用的。每个人似乎都在做的是将实现代码(通常是 foo.cpp)包含在与用户代码相同的翻译单元中。

我希望能够避免这种情况,使用一些不需要包含 foo.cpp 的机制。理想情况下,这应该有效:

主要.cpp:

#include "foo.h"
int main() {
foo<int>();
}

foo.h:

template<typename T> void foo();

foo.cpp:

template<typename T> void foo() {
// implementation here
}

为此,我想我需要某种巧妙的惯用语,可能涉及我的构建机制而不仅仅是源文件和头文件,这样我就不需要包含实现代码,只需要包含头文件。我在想也许与实现文件的内容类似,包括一些自动生成的 header ,其中包含诸如

之类的行
template foo<int>();

这将针对它们丢失的实例解析对象文件(即两次编译过程),或者可能解析源代码(调整编译器?启用一些辅助输出?);你能推荐这样一个成语吗?或者我没有考虑过的另一种选择?

注意:当然,关键在于 foo 模块的代码(foo.hfoo.cpp)并不知道需要哪些实例化,例如不知道是否main()将使用 foo<int>()foo<unsigned char>() .

最佳答案

这是显式实例化。

template foo<int>();

它告诉编译器生成fooint 实现.这就像你为 int 编写了一个实现在你的.cpp文件。如果您知道将来会使用哪些类型,这将很有用。如果您使用 foo<int>,它可以减少项目的总编译时间。在许多翻译单位。例如:

文件 FooBar.h :

template <typename T>
class Bar
{
public:
T data;
void func();
};

template<typename T> void foo();

文件 FooBar.cpp :

template <typename T>
void Bar<T>::func()
{
}

template <typename T>
void foo() {
}

// explicit instantiation

template class Bar<int>;
template class Bar<std::string>;
template foo<int>();
template foo<float>();

主要问题是,您的 fooBar因为模板化的东西只能与实例化类型一起使用。例如,foo限于intfloat , 和 Bar限于intstd::string .

关于c++ - 用于实例化模板代码的显式习惯用法 - 不包括其源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19793772/

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