You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:50:15