如何在头文件中使用其他头文件的部分声明而不暴露全部内容?
问题:避免暴露mpi.h的前提下实现constexpr模板类型到MPI_Datatype的转换
我需要在头文件中实现一个constexpr模板函数,将C++类型映射为对应的MPI_Datatype,当前的实现方式是直接引入<mpi.h>,但这样会把mpi.h的全部内容暴露给所有包含该头文件的代码:
// MyHeader.h #include <mpi.h> // 声明MPI_Datatype和MPI_CHAR template<typename T> constexpr MPI_Datatype Type2MPI() { if (std::is_same<T, char>::value) { return MPI_CHAR; } // ... 其他类型的判断分支 }
常规的做法是把函数声明放在头文件、定义放在包含mpi.h的源文件中,但这是模板函数,无法拆分实现和声明。我希望找到一种方式,不用完整引入mpi.h,只获取其中的MPI_Datatype类型和MPI_CHAR常量,就像下面这种伪代码的效果:
// MyHeader.h from <mpi.h> use MPI_Datatype; from <mpi.h> use MPI_CHAR; // ... 后续代码
示例用例
以下是我头文件中的代码结构,目前必须引入mpi.h才能访问MPI_Datatype:
// MyHeader.h private: template<typename T> constexpr MPI_Datatype Type2Mpi() { ... } void SendImpl(const void* p, MPI_Datatype type); public: template<typename T> void Send(const T& data) { SendImpl (&data, Type2Mpi<T>()); }
临时解决方案
由于constexpr方案无法实现,我改用了模板特化的传统方式:
头文件(不包含mpi.h):
public: template<typename T> void Send(const T& data); };
cpp文件(包含mpi.h):
#include <mpi.h> template<> void Send(const char& data) { SendImpl (&data, MPI_CHAR); } // ... 其他类型的特化实现
内容的提问来源于stack exchange,提问作者mafu
相关产品推荐
相关产品推荐

