gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:37:25 29 4
gpt4 key购买 nike

在我之前的问题中,我问了 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/

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