我有一个关于模板类的C ++项目(库)(不同类型的矩阵,每种类型都有不同的容器,容器的value_type不同 - 矢量等相同)。
每个模板类都有模板成员,因为
DenseRectangularMatrix<std::vector<long double>> //type-container-value_type
必须能够(如果是5x5)乘以
DenseSymmetricMatrix<std::array<float,15>> //(5x5) type-container-value_type
我的问题是编译实例化。 由于存在许多模板关系,因此很难实例化所有可能的情况,不仅用于测试/调试,还要检查编译器是否发生错误。
有没有想过这个?
答案 0 :(得分:1)
解决此类问题的C方法可能是使用宏和脚本来简化所有可能性的生成。但是,我们在C ++中编码,所以让我们用模板替换宏。毕竟,这些是基本类型的宏。
所以我的想法是在更基本的类型中分解你的类型,并使用模板来构建它们。
enum {
RECTANGULAR,
SYMMETRIC,
} DimKind;
enum {
DENSE,
PARSE
} Density;
enum {
STD_ARRAY,
STD_VECTOR
} ContainerType;
enum {
FLOAT,
DOUBLE
} CoordType;
template <CoordType CT>
struct coord_def {
};
struct coord_def<FLOAT>{
typedef float type;
};
struct coord_def<DOUBLE> {
typedef double type;
};
template <ContainerType Cont, CoordType Coord, int Dimension>
struct container_def {
};
template <CoordType Coord, int Dim>
struct container_def<STD_ARRAY, Coord, Dim> {
typedef std::array<Coord,Dim> type;
static const int dim = Dim;
// add any other helper function needed to build the test case for that particular
// container
};
template <CoordType Coord, int Dim>
struct container_def<STD_VECTOR, Coord, Dim> {
typedef std::vector<Coord> type;
static const int dim = Dim;
};
template <Density D, DimKind DK, ContainerType Cont,
CoordType Coord, int XDim, int YDim>
struct TestMatrix {
};
// here specialize the above according to the parameters
// you may need to include helper function to build an instance using the template
// parameters (dimension comesto mind)
然后,您必须定义要测试的操作类型。它们当然可以分为矩阵与分量,矩阵与矢量,矩阵与矩阵。
enum {
// matrix ops list
} MatrixOp;
template <MatrixOp Op, typename M1, typename M2, typename Ret>
Ret binary_op(M1 m1, M2 m2);
// overload for specific functions
template <MatrixOp Op,
ContainerType Cont1, ContainerType Cont2
CoordType Coord1, CoordType Coord2,
int XDim1, int YDim1, int XDim2, int YDim2,
Denstity D1, Density D2,
DimKind K1, DimKind K2>
struct test_op {
typedef TestMatrix<...>::type M1;
typedef TestMatrix<...>::type M2;
void test(M1 m1, M2 m2){
binary_op<MatrixOp,M1,M2>(m1, m2);
}
};
接下来,您的矩阵之间肯定存在代数关系,您可以将其编码为模板,并用于测试。
例如,DenseSymmetricMatrix
模板的参数似乎指定了静态大小的容器类型。对于这样的* n矩阵,数组的维度必须是n *(n + 1)/ 2另一方面,DenseRectangularMatrix
似乎在运行时定义了它的维度。但由于您具有上述维度的关系,因此您可以轻松地将两个测试用例编写为模板:一个用于构建两个具有匹配维度的矩阵,另一个用于具有不匹配维度的矩阵。
最后一步是产生所有可能性。一个简单的脚本通过所有的枚举&#39;轮次中的值应该有助于产生所有可能的测试。
我相信你也可以使用现有的单元测试框架(比如增强版)来构建你的测试。