C++如何定义匹配接收私有构造Badge参数方法的concept约束
错误原因
你定义的concept在检查方法存在性时,直接尝试实例化Badge<BadgeHolder>对象,而Badge的默认构造函数是私有成员,concept检查的上下文没有访问私有构造的权限,因此触发编译错误。
解决方案
使用C++标准库的std::declval模板来获取指定类型的右值引用,该操作不需要实际调用类型的构造函数,可以完美避开Badge私有构造的访问限制,仅做方法签名的匹配检查。
如果你的方法参数是Badge的左值引用/const引用类型,只需要对应调整std::declval的模板参数即可,比如接收const Badge<BadgeHolder>&时可以写std::declval<const Badge<BadgeHolder>&>()。
正确实现代码
首先引入必要头文件:
#include <utility>
修改concept定义:
template <typename Object> concept HasRestricted = requires(Object aObject) { aObject.Restricted_Public_Method(std::declval<Badge<BadgeHolder>>()); };
完整可运行验证代码
#include <utility> template <typename Owner> class Badge { friend Owner; Badge(void) = default; // 保持私有,不破坏Badge模式设计 }; struct BadgeHolder {}; // 修改后的concept template <typename Object> concept HasRestricted = requires(Object aObject) { aObject.Restricted_Public_Method(std::declval<Badge<BadgeHolder>>()); }; struct MyClass { void Restricted_Public_Method(Badge<BadgeHolder>){} }; template <HasRestricted Object> void DoIt(Object& aObject) { } int main() { MyClass cInstance; DoIt(cInstance); // 编译通过 return 0; }
内容的提问来源于stack exchange,提问作者P. Mattione
相关产品推荐
相关产品推荐

