我正在尝试为任意维度的对称块矩阵编写一个通用类。仅给出上三角部分:
A B C
D E
F
因此块的数量为 n*(n+1)/2,其中 n 是维度(此处为 3)。
使用可变参数模板的可能实现是(为了简单起见,我使用整数作为块):
#include <tuple>
#include <cstddef>
template <size_t Dimension, typename... Blocks>
class SymmetricBlockMatrix {
public:
constexpr SymmetricBlockMatrix(Blocks... blocks): blocks(blocks...) { }
constexpr size_t dimension() const {
return Dimension;
}
protected:
const std::tuple<Blocks...> blocks;
};
int main() {
constexpr SymmetricBlockMatrix<3, int, int, int, int, int, int> m(1, 2, 3, 4, 5, 6);
return 0;
}
我当然会检查块的数量是否与尺寸一致。
是否可以以某种方式仅显式提供维度并让编译器推断块的类型?然后我可以写:
int main() {
constexpr SymmetricBlockMatrix<3> m(1, 2, 3, 4, 5, 6);
return 0;
}
这会导致以下编译器错误:
error: no matching function for call to 'SymmetricBlockMatrix<3>::SymmetricBlockMatrix(int, int, int, int, int, int)'
18 | constexpr SymmetricBlockMatrix<3> m(1, 2, 3, 4, 5, 6);
您可以使用旧的
make
辅助函数模板技巧,如下所示:
template <size_t V, typename... T>
constexpr SymmetricBlockMatrix<V, T...> make_SymmetricBlockMatrix(T... t)
{
return SymmetricBlockMatrix<V, T...>{t...};
}
int main() {
constexpr SymmetricBlockMatrix<3, int, int, int, int, int, int> k(1, 2, 3, 4, 5, 6);
constexpr auto m = make_SymmetricBlockMatrix<3>(1, 2, 3, 4, 5, 6); //works now
}