两个概念是否有可能以某种方式在它们的改进中相互使用?
示例:
template <typename T>
concept Node = /* ??? */;
template <typename T>
concept Visitor = /* ??? */;
struct NodeArchetype {
// ...
template <Visitor V>
void visit(V&&) {}
};
struct VisitorArchetype {
// ...
template <Node N>
void operator()(N&&) {}
};
static_assert(Node<NodeArchetype>);
static_assert(Visitor<VisitorArchetype>);
一个类似的 question 是为什么不能预先声明概念(这是我想到的第一个 C++ 式解决方案),与这个问题相关但略有不同。
问题已经结束,但这是评论中要求的失败尝试:
#include <concepts>
struct NodeArchetype;
struct VisitorArchetype;
template <typename V>
concept Visitor = requires(V visitor) {
{ visitor.template operator()(std::declval<NodeArchetype&>) } -> std::same_as<void>;
{ visitor.template operator()(std::declval<NodeArchetype&&>) } -> std::same_as<void>;
};
template <typename N>
concept Node = requires(N node) {
{ node.template visit(std::declval<VisitorArchetype&>) } -> std::same_as<void>;
{ node.template visit(std::declval<VisitorArchetype&&>) } -> std::same_as<void>;
};
struct NodeArchetype {
template <Visitor V>
void visit(V&&) {}
};
struct VisitorArchetype {
template <Node N>
void operator()(N&&) {}
};
static_assert(Node<NodeArchetype>);
static_assert(Visitor<VisitorArchetype>);