c++ - 递归显式模板实例化以导出库的符号

标签 c++ templates boost-preprocessor

在我之前的问题中,我问了 is recursive explicit template instantiation possible .我看到这确实是可能的;然而,这个实例化结果证明只在本地有效,递归实例化模板的符号不会导出到目标文件,因此不会出现在(共享)库中。所以我在这里更准确地问问题,就像我之前的帖子一样:

给定一个模板

template<int dim> class Point { ... };

这个模板可以显式实例化

template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;

导出 Point<0> 的符号, ..., Point<3>进入当前翻译单元的目标文件。我不想像上面那样单独实例化每个模板,而是想通过一次调用递归地实例化它们。

任何实现这一点的解决方案都很好,无论是模板元编程的风格,还是通过辅助类,如

template class RecursiveInstantiate<Point, 3>;

或通过预处理器。在这里,我查看了 boost 预处理器库,它似乎有一些循环结构。但是,我从未使用过 boost 预处理器库(欢迎提供任何建议),但乍一看我怀疑循环是否可以与显式模板实例化一起使用。

任何建议,以及为什么不可能实现我想要实现的目标的解释,我们都将不胜感激。


事实上,我有兴趣将其推广到具有多个模板参数的类,例如 Node<int i1,int i2,int i3>对于 {0,1,2,3} 中 i1,i2,i3 的所有组合。但我希望能够自己完成第二部分。像往常一样,我想通过仅在一个翻译单元中定义模板来使用显式实例化来加快编译时间,因此我需要将模板的方法导出到目标文件中。

我希望有一个独立于编译器的解决方案,但如果那不可能,我需要它用于带有 g++/clang 的 Linux。


请参阅下文,了解我得到的解决方案以及由此得出的最终解决方案。

最佳答案

似乎是 Boost.Preprocessor 的工作:

#include <boost/preprocessor/repetition/repeat.hpp>

#define INSTANTIATE(_, n, type) template class type<n>;

BOOST_PP_REPEAT(3, INSTANTIATE, Point)

当然,你可以将其嵌入到另一个宏中以使其看起来更好:

#define INSTANTIATE(_, n, type) template class type<n>;
#define INSTANTIATE_N(n, type) BOOST_PP_REPEAT(n, INSTANTIATE, type)

INSTANTIATE_N(3, Point)

关于c++ - 递归显式模板实例化以导出库的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7398964/

相关文章:

方法定义中的 C++ 模板参数

我可以附加到预处理器宏吗?

c++ - 如何迭代 Boost Multi_index 容器的索引?

c++ - 尽量避免重复调用一个函数

c++ - 使用 C++ 时程序与数据库的连接

c++ - 使用 std::vector::assign() 将 vector 的一部分分配给自身

c++ - 使用C++按字典顺序在一个巨大的文件中对文本行进行外部排序

c++ - 优化控制台程序

c++ - 为什么我应该在函数签名中避免 std::enable_if

templates - 如何在 Symfony2/Twig 模板中包含原始 HTML 文件?