含可变参数的模板concept约束触发MSVC19编译错误求助
问题分析与解决
你的代码在MSVC19中触发“关联约束未满足”错误的核心原因是:多参数concept作为模板类型约束时,编译器无法自动推导剩余的可变参数模板参数。
原代码里,ChProcessSignalFunctionReturnVoid是包含_ChFunction和_ChArguments...两个模板参数的concept,但在ChExecute中你直接用它约束_ChFunction:
template < ChProcessSignalFunctionReturnVoid _ChFunction, typename... _ChParameters> constexpr void ChExecute(...)
这种写法只给concept传了第一个模板参数_ChFunction,剩下的_ChArguments...没有对应推导来源,MSVC的约束检查机制会判定关联约束不满足。
修复方案
调整ChExecute的约束方式,通过requires子句明确将_ChParameters传递给concept的可变参数,同时完善concept对返回值为void的校验(原代码未做这层约束):
完整修复代码
#include <concepts> #include <utility> template<typename _ChFunction, typename... _ChArguments> concept ChProcessSignalFunctionReturnVoid = requires(_ChFunction func, _ChArguments&&... args) { // 检查调用表达式的返回值类型为void { func(std::forward<_ChArguments>(args)...) } -> std::same_as<void>; }; template <typename _ChFunction, typename... _ChParameters> // 通过requires子句明确传递参数类型给concept requires ChProcessSignalFunctionReturnVoid<_ChFunction, _ChParameters...> constexpr void ChExecute( _ChFunction func, _ChParameters&&... params) { func(std::forward<_ChParameters>(params)...); } int main() { ChExecute( [](int a, int b)->void {}, 5, 10); return 0; }
另一种简化方案(单参数concept)
如果不需要单独复用带参数类型的concept,也可以把约束直接写在ChExecute的requires里,代码更简洁:
#include <concepts> #include <utility> template <typename _ChFunction, typename... _ChParameters> constexpr void ChExecute( _ChFunction func, _ChParameters&&... params) requires requires { { func(std::forward<_ChParameters>(params)...) } -> std::same_as<void>; } { func(std::forward<_ChParameters>(params)...); } int main() { ChExecute( [](int a, int b)->void {}, 5, 10); return 0; }
两种写法都能在MSVC19中正常编译,同时保证函数调用返回值为void的约束。
内容的提问来源于stack exchange,提问作者VeNToR
相关产品推荐
相关产品推荐

