C++多模板参数Concept报错:模板参数过多问题排查
问题描述
以下C++代码定义了两个concept,用于检查类型是否支持双下标操作,以及结构体是否存在返回该类型的func()方法:
template<typename T, typename U> concept supports_subscript_op_for_two_indices = requires(T t, U) { { t[0] } -> std::same_as<U>; { t[1] } -> std::same_as<U>; }; template<typename T> concept has_func_returning_int = requires(T t) { { t.func() } -> supports_subscript_op_for_two_indices<decltype(t.func()), int>; };
运行时报错:"too many template arguments for concept 'supports_subscript_op_for_two_indices'",需求是检查结构体是否拥有返回类似std::array<int,2>或支持[]操作类型的func()方法。
错误原因
问题出在has_func_returning_int的写法上:->后面的约束是针对表达式结果类型的单参数约束,你不能直接在这里传递双参数的supports_subscript_op_for_two_indices(它需要两个模板参数),编译器会把它当成只接受一个参数的concept,因此报错参数过多。
修正方案
有两种简洁的修正方式:
方式一:在requires表达式中直接用双参数concept做约束
调整has_func_returning_int的写法,用requires子句直接验证func()的返回类型是否满足双下标约束:
#include <concepts> #include <array> template<typename T, typename U> concept supports_subscript_op_for_two_indices = requires(T t) { // 注意:std::array的operator[]返回引用,这里用U&更准确 { t[0] } -> std::same_as<U&>; { t[1] } -> std::same_as<U&>; }; template<typename T> concept has_func_returning_int = requires(T t) { // 先确保func()可调用,再检查其返回类型符合约束 { t.func() }; requires supports_subscript_op_for_two_indices<decltype(t.func()), int>; };
方式二:直接在concept内写下标检查逻辑
如果不需要复用supports_subscript_op_for_two_indices,可以简化成直接检查func()返回值的下标操作:
#include <concepts> #include <array> template<typename T> concept has_func_returning_int = requires(T t) { { t.func()[0] } -> std::same_as<int&>; { t.func()[1] } -> std::same_as<int&>; };
两种方式都能满足你的需求,比如测试以下结构体:
struct Test { std::array<int,2> func() { return {1,2}; } }; static_assert(has_func_returning_int<Test>); // 编译通过
内容的提问来源于stack exchange,提问作者psb
相关产品推荐
相关产品推荐

