如何在单个C++ concept中实现需求的逻辑或运算?
在单个Concept中实现逻辑或需求
你可以通过拆分独立的requires表达式并使用||运算符,在单个concept里实现“满足任一条件即可”的逻辑:
直接实现方式
#include <concepts> template<typename Class> concept has_member = requires (Class t) { {t.isInterface() }->std::same_as<bool>; } || requires (Class t) { {t.canInterface() }->std::same_as<bool>; }; // 可继续添加更多用||连接的requires表达式 struct A { bool isInterface() const { return true; } }; struct B { bool canInterface() const { return true; } }; void foo(const has_member auto& A_or_B) { // 执行操作 } int main() { foo(A{}); // 正常运行 foo(B{}); // 正常运行 }
可读性优化方式(多条件场景)
如果需要判断的条件较多,可以先为每个条件定义子concept,再用逻辑或组合,代码可读性更好:
#include <concepts> template<typename Class> concept has_isInterface = requires (Class t) { {t.isInterface() }->std::same_as<bool>; }; template<typename Class> concept has_canInterface = requires (Class t) { {t.canInterface() }->std::same_as<bool>; }; template<typename Class> concept has_member = has_isInterface<Class> || has_canInterface<Class>; // 可继续添加更多子concept的或运算 // 后续结构体、函数及main函数代码与上述示例一致
原理说明
单个requires{...}代码块内的所有需求是逻辑与关系,必须全部满足才会通过校验。而独立的requires表达式支持用||/&&等逻辑运算符组合,以此实现“满足任一条件即可通过”的效果。
内容的提问来源于stack exchange,提问作者LernerCpp
相关产品推荐
相关产品推荐

