H. *_*ier 8 c++ templates boost-preprocessor
在我之前的问题中,我问过递归显式模板实例化是否可能.我看到它确实可能; 但是,此实例化仅在本地有效,递归实例化模板的符号不会导出到目标文件,因此不会出现在(共享)库中.所以我在这里更准确地提出问题,就像我之前的帖子一样:
给出一个类似的模板
template<int dim> class Point { ... };
Run Code Online (Sandbox Code Playgroud)
这个模板可以明确地实例化
template class Point<0>;
template class Point<1>;
template class Point<2>;
template class Point<3>;
Run Code Online (Sandbox Code Playgroud)
它将Point<0>...... 的符号导出Point<3>到当前翻译单元的目标文件中.我没有像上面那样单独实例化每个模板,而是想通过一次调用递归地实例化它们.
任何实现这一目标的解决方案都很好,无论是模板元编程的风格,还是通过辅助类
template class RecursiveInstantiate<Point, 3>;
Run Code Online (Sandbox Code Playgroud)
或通过预处理器.在这里,我研究了boost预处理器库,它似乎有一些循环结构.但是,我从未使用过boost预处理器库(任何建议都很受欢迎),但乍一看,如果循环可以与显式模板实例一起使用,我会持怀疑态度.
任何建议,也解释为什么我想要达到的目标是不可能的.
其实我感兴趣的概括这对于喜欢多个模板参数类Node<int i1,int i2,int i3>为I1,I2,I3的所有组合{0,1,2,3}.但我希望能够自己解决这第二部分.像往常一样,我想通过仅在一个转换单元中定义模板来使用显式实例化来加速编译时间,因此我需要将模板的方法导出到目标文件中.
我希望有一个独立于编译器的解决方案,但如果这不可能,我需要用于带有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)
Run Code Online (Sandbox Code Playgroud)
当然,您可以将其嵌入到另一个宏中以使其看起来更好:
#define INSTANTIATE(_, n, type) template class type<n>;
#define INSTANTIATE_N(n, type) BOOST_PP_REPEAT(n, INSTANTIATE, type)
INSTANTIATE_N(3, Point)
Run Code Online (Sandbox Code Playgroud)