如何修改C++概念Foo以适配带引用参数的method方法?
解决C++概念匹配问题:不修改类实现适配左值引用参数
问题核心:原概念中传递的typename F::Bar{}是临时右值,无法绑定到FooImpl::method要求的非const左值引用参数,导致概念约束不满足。
以下是两种无需修改FooImpl的解决方案:
方案一:在requires参数中声明左值变量
直接在requires的参数列表里定义一个F::Bar类型的左值变量,传递给method:
struct FooImpl { using Bar = int; void method(Bar&) {} }; template <typename F> concept Foo = requires(F f, typename F::Bar b) { { f.method(b) }; }; static_assert(Foo<FooImpl>); // 编译通过
原理:b是左值,完全符合method对非const左值引用参数的要求,概念的约束条件得以满足。
方案二:在requires表达式内构造左值
如果不想在requires参数列表额外添加变量,也可以在表达式内部创建左值:
struct FooImpl { using Bar = int; void method(Bar&) {} }; template <typename F> concept Foo = requires(F f) { typename F::Bar; // 先确保Bar类型存在 { [&f]() -> decltype(auto) { typename F::Bar b; return f.method(b); }() }; }; static_assert(Foo<FooImpl>); // 编译通过
原理:通过lambda内部构造左值b,再传递给method,间接满足参数类型要求。
内容的提问来源于stack exchange,提问作者dshin
相关产品推荐
相关产品推荐

