Angeben eines Konzepts für einen Typ mit einer Elementfunktionsvorlage mithilfe von Concepts Lite

Ich versuche, mit Concepts Lite ein Konzept anzugeben, um einen Typ höherer Qualität mit einer Elementfunktionsvorlage einzuschränken. Ich bin jedoch nicht in der Lage, innerhalb der zu findentechnische Spezifikation oder derLernprogramm eine Klausel, die sich mit Vorlagenaussagen innerhalb eines Konzepts befasst.

Wie geht das?

Beispiel: Angenommen, ich habe den höherwertigen TypHKT mit einer MitgliedsfunktionsschabloneF:

template<class T>
struct HKT {
  template<class U> // this looks like e.g. rebind in std::allocators
  auto F(U) -> HKT<U>;
};

und das möchte ich jetzt ein Konzept zur Einschränkung dieser höherwertigen Typen spezifizieren:

template <template <class> class HKT, class T>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) { // HKT<T> is a type, h is an object
    // HKT<T> needs to have a member function template that 
    // returns HTK<U> where the type U is to be deduced and
    // it can be any type (it is unconstrained)
    template<class U>  // is there a syntax for this?
    h.F(std::declval<U>()) -> HKT<U>; 
  }
}

Beachten Sie, dass ich so etwas tun könnte:

template <template <class> class HKT, class T, class U>
concept HKTWithTemplateMemberFunctionF {
  return requires(HKT<T> h) {
      h.F(std::declval<U>()) -> HKT<U>;
  }
}

Das bedeutet aber, dass ich es wissen mussU an der Einschränkungsstelle.

Es ist mir eigentlich egal, ob ein Ersatz für einen bestimmten gegeben istU schlägt fehl oder nicht, obwohl ich sehen kann, warum dies ein Problem sein könnte: z.B. Wenden Sie eine Einschränkung an, um sicherzustellen, dass Ihre Funktion nicht fehlschlägt, und schlagen Sie dann fehl, weil die Einschränkung erfüllt wurde, die Ersetzung in der Mitgliedsfunktionsvorlage jedoch zum Zeitpunkt der Instanziierung fehlgeschlagen ist (würde es helfen, wenn die Mitgliedsfunktionsvorlage eingeschränkt wäre?).

Antworten auf die Frage(2)

Ihre Antwort auf die Frage