c++ - 如何根据目标文件中缺少的符号来实例化模板?

标签 c++ templates code-generation build-process instantiation

(这个问题有点晦涩,没有太多动机,所以请耐心等待。)

为了便于讨论,我们假设我有两个文件,a.cppb.hpp .假设 a.cpp有声明

template <typename T> void foo(T& t);

在代码的某处它有命令:

foo<int>(1234);
foo<double>(12.34);

同时 b.hpp包含实际的(模板化的)定义,仅此而已。

现在,a.cpp , 编译时不包括 b.hpp将编译成目标文件,a.o ,期望与包含 foo<int> 的目标代码的其他文件链接和 foo<double> .本身,b.hpp没有实例化 foo() ,所以单独编译是没有用的。

但是,如果我要确定哪些实例化是必需的,并生成 a.aux.cpp包含最少的代码来实例化 a.cpp 所需的模板,我就不必手动确保实例化了。

那么,我该如何实现呢?我正在按照做的思路思考

nm --undefined-only a.cpp | sed 's/^ *//;' | c++filt | grep foo

获取签名。然后我需要在不实际引起任何其他副作用的情况下强制它们的实例化......也许定义一个变量,其类型是指向 foo<T> 的指针。对于 T 的每个值我找到了。

无论如何,这一切看起来都很笨拙,我想知道是否有一些与构建相关的工具可以为您做这件事。或者我是否应该完全采用另一种方法。

最佳答案

我不认为您可以开箱即用。您可能会尝试使用 LibClang 等工具编写自己的“所需实例化提取器” .

另请注意,获得可在其他翻译单元中使用的实例化的唯一合法方法是请求显式实例化:

template void foo(int& t);

关于c++ - 如何根据目标文件中缺少的符号来实例化模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28352092/

相关文章:

c++ - 静态模板函数访问静态类成员

c++ - 捕获访问冲突异常?

c++ - Stringstream 未完全填充

c++ - 模板类构造函数

c++ - 如何在模板代码中使用编译时常量条件避免 "conditional expression is constant"警告?

python - Jinja2 中的 zip(list1, list2) ?

c - 将大量但已知数量的参数传递给 C 函数

c# - 通过 CodeDom 生成非托管 C++

c++ - 我已经设置了 CPUPROFILE 环境变量并链接了 -lprofiler。为什么 gperftools 没有启动探查器?

C++ 为什么这个派生类会出错