仅在发布库中忽略#include?模板静态库分发难题
显式实例化静态模板库的头文件分发问题
我的模板库已完成所有类的显式实例化并编译为静态库,目录结构如下:
repo/ | - include/ | - mylib/ | - myclass.hpp | - implementation/ | - myclass.ipp | - source/ | - mylib/ | - myclass.cpp
各文件的职责与代码示例如下:
myclass.hpp(模板类声明)
template <typename T> class MyClass { ... }; #include "implementation/myclass.ipp"
myclass.ipp(模板定义+显式实例化声明)
template <typename T> void MyClass<T>::MyClass() { ... }; // 其他模板成员定义... extern template class MyClass<MyOtherType1>; extern template class MyClass<MyOtherType2>; // 其他显式实例化声明...
myclass.cpp(实际显式实例化代码)
template class MyClass<MyOtherType1>; template class MyClass<MyOtherType2>; // 其他显式实例化定义...
注:上述为简化示例,实际库的模板、约束及特化逻辑更复杂。最初分离声明与实现是为提升头文件可读性,后续因仅支持约6种已知类型,采用了全显式实例化方案。
当前问题:
静态库构建与运行均正常,但由于.hpp直接包含对应的.ipp,所有第三方依赖会被传递给库的使用者——即便这些依赖已经静态链接到我的库中,无对应依赖的系统仍难以使用该库。
通常模板库不得不接受这个问题,但我的库已完全显式实例化,模板定义对使用者而言不再是必需的。因此我希望分发/安装头文件时,忽略#include "_.ipp"语句。
我的修改思路:
将显式实例化声明移至头文件,调整后的myclass.hpp如下:
template <typename T> class MyClass { ... }; #include "implementation/myclass.ipp" extern template class MyClass<MyOtherType1>; extern template class MyClass<MyOtherType2>; // 其他显式实例化声明...
但我不确定如何可靠实现开发库时包含#include "_.ipp",分发/安装时则不包含,从而让头文件可以配合预编译库单独使用。
请问基于当前的文件结构,这样的修改是否安全?
内容的提问来源于stack exchange,提问作者Chris Gnam
相关产品推荐
相关产品推荐

