Wie implementiert man die verallgemeinerte Form von std::same_as (d. h. für mehr als zwei Typparameter), die unabhängig von der Parameterreihenfolge ist?

Wie implementiert man die verallgemeinerte Form von std::same_as (d. h. für mehr als zwei Typparameter), die unabhängig von der Parameterreihenfolge ist?

Von cppreference.com Constraint_normalization

Also

template <typename... Types>
concept are_same = (... && same_with_others<Types, Types...>);

ist "atomar".

Also tatsächlich are_same<U, T> und are_same<T, U> sind nicht gleichwertig.

Ich sehe nicht, wie ich es implementieren soll :-(


Das Problem ist bei diesem Konzept:

template <typename T, typename... Others>
concept are_same = (... && std::same_as<T, Others>);

Ist das die normalisierte Form dieses Konzepts ... genau das? Wir können das nicht "entfalten" (es gibt nichts zu tun), und die aktuellen Regeln normalisieren sich nicht durch "Teile" eines Konzepts.

Mit anderen Worten, was Sie brauchen, damit dies funktioniert, ist, dass sich Ihr Konzept normalisiert in:

... && (same-as-impl<T, U> && same-as-impl<U, T>)

in:

... && (is_same_v<T, U> && is_same_v<U, T>)

Und betrachten Sie einen fold-Ausdruck && Constraint, um einen anderen Fold-Expression-Constraint && zu subsumieren wenn seine zugrunde liegende Einschränkung die zugrunde liegende Einschränkung des anderen subsumiert. Wenn wir diese Regel hätten, würde Ihr Beispiel funktionieren.

Es könnte möglich sein, dies in Zukunft hinzuzufügen - aber die Sorge um die Subsumtionsregeln besteht darin, dass wir nicht von Compilern verlangen wollen, alles zu tun und einen vollständigen SAT-Solver zu implementieren, um die Constraint-Subsumtion zu überprüfen. Dieser scheint es nicht so viel komplizierter zu machen (wir würden wirklich nur den && hinzufügen und || Regeln durch Fold-Ausdrücke), aber ich habe wirklich keine Ahnung.

Beachten Sie jedoch, dass, selbst wenn wir diese Art von Faltungsausdruck-Subsumtion hätten, are_same<T, U> würde immer noch nicht std::same_as<T, U> subsumieren . Es würde nur are_same<U, T> subsumieren . Ich bin mir nicht sicher, ob dies überhaupt möglich wäre.