如何编写C++ Concept约束函数参数为自定义模板别名类型?
问题背景
现有如下模板类型定义(已修正原代码的括号匹配语法错误):
template<typename T> using a_T = std::unique_ptr<T[]>; template<typename T> using b_T = std::unique_ptr<a_T<T>[]>; template<typename T> using c_T = std::unique_ptr<b_T<T>[]>; template<typename T> using d_T = std::unique_ptr<c_T<T>[]>;
同时定义了如下函数,要求仅支持上述4种类型:
template<typename T> bool is_allocated(T const& ref){ return (ref == nullptr); }
尝试编写C++ Concept来限制传入类型,但写法有误:
template<typename T> concept cArrayType = std::is_same_v<AT,a_T<T>> || std::is_same_v<AT,b_T<T>> || std::is_same_v<AT,c_T<T>> || std::is_same_v<AT,d_T<T>>;
核心问题是不知道如何正确传递待检查类型到Concept中,实现类型匹配。
解决方案
方式一:借助辅助Trait实现Concept
先定义一个判断类型是否属于目标集合的Trait,再基于它实现Concept:
#include <memory> #include <type_traits> // 基础模板,默认返回false template<typename T> struct is_array_ptr_type : std::false_type {}; // 针对四种目标类型特化,返回true template<typename U> struct is_array_ptr_type<a_T<U>> : std::true_type {}; template<typename U> struct is_array_ptr_type<b_T<U>> : std::true_type {}; template<typename U> struct is_array_ptr_type<c_T<U>> : std::true_type {}; template<typename U> struct is_array_ptr_type<d_T<U>> : std::true_type {}; // 基于Trait实现Concept template<typename T> concept cArrayType = is_array_ptr_type<T>::value;
方式二:直接在Concept中做模板匹配
利用Concept的模板推导能力,通过匿名模板函数直接匹配目标类型:
#include <memory> #include <type_traits> template<typename T> concept cArrayType = requires(T t) { // 尝试匹配a_T<U> []<typename U>(a_T<U> const&){}(t) || // 尝试匹配b_T<U> []<typename U>(b_T<U> const&){}(t) || // 尝试匹配c_T<U> []<typename U>(c_T<U> const&){}(t) || // 尝试匹配d_T<U> []<typename U>(d_T<U> const&){}(t); };
应用到目标函数
修改函数模板,用cArrayType限制参数类型:
template<cArrayType T> bool is_allocated(T const& ref){ return (ref == nullptr); }
内容的提问来源于stack exchange,提问作者schnedan
相关产品推荐
相关产品推荐

