如何创建仅匹配diagonal_matrix模板类实例的C++ Concept?
实现仅匹配
diagonal_matrix模板实例的Concept 我定义了如下模板类:
template<Vector T> struct diagonal_matrix;
希望创建一个DiagonalMatrix concept,使其仅匹配diagonal_matrix模板类的所有实例,满足:
DiagonalMatrix<diagonal_matrix<std::vector<double>>> == true DiagonalMatrix<diagonal_matrix<std::array<float, 4>>> == true DiagonalMatrix<diagonal_matrix<std::span<int, 10>>> == true DiagonalMatrix<diagonal_matrix<my::random_access_container_view<unsigned int>>> == true DiagonalMatrix<other_matrix> == false
注意diagonal_matrix是other_matrix的功能子集,请问能否在不为该结构体添加static constexpr bool I_am_a_diagonal_matrix = true;标记的前提下,实现这样的Concept?
可以实现,核心思路是利用模板特化完成类型检测,不需要修改原diagonal_matrix结构体代码。具体实现如下:
#include <type_traits> // 基础模板:默认不匹配 template<typename T> struct is_diagonal_matrix : std::false_type {}; // 对diagonal_matrix的所有实例特化:标记为匹配 template<Vector T> struct is_diagonal_matrix<diagonal_matrix<T>> : std::true_type {}; // 基于辅助结构体定义Concept template<typename T> concept DiagonalMatrix = is_diagonal_matrix<T>::value;
原理说明
- 基础模板
is_diagonal_matrix默认继承std::false_type,对任意类型返回false; - 通过模板特化,针对所有
diagonal_matrix<T>实例(无论T是哪种符合Vector约束的类型),让is_diagonal_matrix继承std::true_type,返回true; - 最终用Concept封装这个判断逻辑,直接复用特化后的结果。
这种方式完全通过外部模板逻辑实现类型匹配,所有diagonal_matrix的实例都会被Concept识别,其他类型(包括other_matrix)则不会匹配。
内容的提问来源于stack exchange,提问作者Chameleon
相关产品推荐
相关产品推荐

