两个概念在它们的改进中相互引用

时间:2021-06-27 17:50:29

标签: c++ c++20 c++-concepts

两个概念是否有可能以某种方式在它们的改进中相互使用?

示例:

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>);

https://godbolt.org/z/esz169qKh

0 个答案:

没有答案
相关问题