使用c++函数模板实现一组函数

Using C++ function templates for a group of functions

本文关键字:一组 函数 c++ 函数模板 实现 使用      更新时间:2023-10-16

根据矩阵大小,我有不同的方阵乘法函数,从8x8到20x20不等。这些函数彼此不同,因为每个函数采用不同的优化策略,即不同的循环排列和不同的循环展开因子。在程序的生命周期中,矩阵的大小是不变的。我的目标是减少决定必须使用哪个函数的时间。例如,幼稚的实现是:

 if (matrixSize == 8) C = mxm8(A, B);
 else if (matrixSize == 9) C = mxm9(A,B);
 ...
 else if (matrixSize == 20) C = mxm20(A,B);

在这种情况下,决定每个矩阵乘法使用哪个函数所花费的时间是非平凡的。可以立即调用适当的函数,也许使用c++函数模板?

如果矩阵的大小在程序的生命周期内是不变的,那么您可以使用std::array (std::array)作为矩阵的类型。然后,您可以有一个乘法函数,并为您支持的不同类型重载它,选择将在编译时完成。

如果您为矩阵使用一些自定义类,您可以采用这种方法,并使其成为模板类,其中大小是模板参数。

如果在编译时知道矩阵的大小,则可以使用如下格式:

constexpr auto matrixSize = 8;
C = mxm<matrixSize>(A, B);

并提供任何已知大小的专门化。

如果在编译时不知道函数的大小,可以将函数存储在map中,如下所示:

map<size_t, function<matrix (const matrix&, const matrix&>> multipliers;
multipliers.insert(make_pair(8, mxm8));

,然后使用如下格式:

C = multipliers[matrixSize](A, B);