对于统计包,我需要包括一个数值计算库,然后选择了armadillo。我想将所有依赖关系保留在一个"包装器"文件中(能够轻松切换数值库(。目前,包装器到armadillo,称为mixt_LinAlg.h
仅包含:
#ifndef MIXT_LINALG_H
#define MIXT_LINALG_H
#include "mixt_Typedef.h"
#include <armadillo>
using namespace arma;
namespace mixt {
template<typename T>
using Matrix = Mat<T>;
template<typename T>
using Vector = Col<T>;
template<typename T>
using RowVector = Row<T>;
}
#endif // MIXT_LINALG_H
这样,如果我导入此标头,则可以访问Matrix
,Vector
和RowVector
模板类,而无需直接导入Armadillo。现在,在Armadillo中,有一个函数arma::approx_equal
,例如,该功能为两个Col<T>
,并返回bool
。
如果我简单地使用approx_equal
而不是arma::approx_equal
调用此功能,则它会在MacOS上与Clang一起编译。但是,当我在Ubuntu上使用GCC编译时,它抱怨它找不到approx_equal
。
如何使approx_equal
可用于任何包含mixt_LinAlg.h
的文件,而无需在包括文件中引用arma
名称空间?
在您自己的名称空间中添加到标题中的 approx_equal
,该命名空间围绕arma::approx_equal
或任何其他实现。
换句话说,将类似的东西添加到armadillo的标题:
... my_namespace::approx_equal (...) {
return arma::approx_equal(...);
}
您必须为您要切换的每个实现都有这些包装器之一。