C++20中能否用Concept约束类的模板成员方法?
如何用Concept约束类的模板成员方法?
你的需求并非无法实现,只是原代码的requires表达式写法不符合C++语法规则。下面具体解释并给出正确实现:
原代码报错原因
在requires表达式中,{ template <event e> p_t.publish(e &) }这种写法是非法的——requires块内的内容必须是可编译的合法表达式,不能在表达式内部声明模板参数。
正确实现方式
根据你的需求(要求类具备一个模板成员方法publish,接受任意符合event concept的类型引用,且返回void),有两种简洁且符合标准的写法:
写法1:利用模板实参推导
如果publish方法的模板参数可以通过函数参数推导(比如参数是E&或const E&),可以直接在requires中调用方法:
#include <concepts> template <typename T> concept event = std::default_initializable<T> && std::copy_constructible<T>; template <typename T> concept dispatcher = requires(T t, event auto& e) { { t.publish(e) } -> std::same_as<void>; };
这种写法会自动推导publish的模板参数为decltype(e),同时验证该类型满足event,且方法返回void。
写法2:显式约束模板成员
如果需要更明确地指定模板参数的约束,可以嵌套requires表达式:
#include <concepts> #include <type_traits> template <typename T> concept event = std::default_initializable<T> && std::copy_constructible<T>; template <typename T> concept dispatcher = requires(T t) { requires requires(event auto& e) { { t.template publish<std::decay_t<decltype(e)>>(e) } -> std::same_as<void>; }; };
这种写法显式要求T存在模板成员publish,且当传入符合event的类型时,调用返回void。
验证示例
你可以用如下类测试上述concept:
// 符合event的类 struct MyEvent { MyEvent() = default; MyEvent(const MyEvent&) = default; }; // 符合dispatcher的类 struct MyDispatcher { template <event E> void publish(E&) {} }; static_assert(dispatcher<MyDispatcher>); // 编译通过
内容的提问来源于stack exchange,提问作者canellas
相关产品推荐
相关产品推荐

