如何定义可以进行结构化绑定的对象的概念?

问题描述

我想定义一个concept,它可以检测类型T是否可以是结构化绑定

template <typename T>
concept two_elements_structured_bindable = requires (T t) {
  auto [x,y] = t;
};

但是无法编译。是否有适当的方法来定义像这样的concept

解决方法

否。

结构化绑定有以下三种情况:

  1. 数组。这很容易检测。

  2. 类似元组的元组。您可以轻松检查std::tuple_size<E>::value是否有效,然后检查std::tuple_element<I,E>::type作为所有正确类型的类型是否有效。但是get案比较难,因为您必须处理成员与非成员的关系……但是我认为这是可行的。

  3. 具有所有公共(是的,技术上可访问的)成员作为同一类的直接成员的类型。当前技术无法检测到这一点。我认为magic_get可以处理struct X { int a,b; };,但是struct Y : X { };struct Z { X& x; };都无法处理。

从C ++ 20开始,您将需要某种内在的编译器来执行此操作。