2013-09-06 15 views
19

Betrachten Sie eine class A erfüllt zwei Konzepte ConceptA und ConceptB. Lassen Sie eine Funktion foo für die beiden Konzepte überlastet:Was entspricht dem Cast für Konzepte?

void foo(ConceptA& arg); 
void foo(ConceptB& arg); 
A a; 
fun(concept_cast<ConceptA>(a)); 

Hinweis: Dieses Beispiel verwendet die „Terse Notation“ Syntax als Teil N3701 vorgeschlagen, §5

Gibt es existieren so etwas wie concept_cast die Benutzer können die Überladung auswählen?

ZB: Lets sagen ConceptA sagt T eine Elementfunktion bar() ConceptB haben muss, sagt T eine Mitgliedsfunktion baz() und class A beide bar() und baz() Memberfunktion

Seine eindeutig zweideutig hat haben, aber Gibt es eine Möglichkeit, explizit auszuwählen, wie wir static_cast für normale Überlasten haben?

Aktualisieren: Akzeptierte Antwort ist mehr als 2 Jahre alt. Irgendein Update in C++ 17?

+1

Vielleicht ist das eine mehrdeutige Überlastung in erster Linie zu definieren? Ich bin daran interessiert, die richtige Antwort zu hören. – David

+1

Ist das nicht 'static_cast'? Angenommen, "a" wird sowohl von "ConceptA" als auch von "ConceptB" abgeleitet. –

+1

@ JonathanPotter 'static_cast' in was ?. Ist es möglich, 'static_cast' in ein' Concept' zu verwandeln? – balki

Antwort

4

Wenn eines der Konzepte einer eingeschränkteren Version des anderen ist, (zum Beispiel alles, was auch ConceptAConceptB befriedigen genügt aber nicht umgekehrt), dann wird die Überlast-constrained dass A erfüllt gewählt wird.

Wenn keines der beiden Konzepte eingeschränkter als das andere ist, gelten die beiden als mehrdeutige Überladungen. Wenn man bedenkt, wie Sie die Frage formuliert haben, dann nehme ich an, dass Sie das bereits wussten.

In Bezug auf concept_cast, ich glaube nicht, dass es so etwas in dem aktuellen Vorschlag gibt. Zumindest nicht beim Treffen in Bristol (Apr '13). Ich erwarte nicht, dass sich dies geändert hat, da der aktuelle Fokus anscheinend darauf liegt, sicherzustellen, dass der Kern des Konzepts "lite/constraints" für den Ausschuss praktikabel und akzeptabel ist.

Es wird wahrscheinlich eine gewisse Nachfrage für die explizite Auswahl überladener Template-Funktionen geben, und vielleicht ist eine solche Besetzung das Richtige, aber ich bin mir nicht sicher. Berücksichtigen Sie, dass ein solcher Cast nur nützlich sein könnte für Überladung Disambiguierung, wo als static_cast ist eine allgemeinere Funktion. Das Ergebnis der concept_cast wäre dasselbe wie der ursprüngliche Wert außerhalb des Kontextes der Überladungsauflösung!

Edit: am jüngsten Vorschlag der Suche (N3701), dann ist es nicht vorgesehen, explizit angeben, welches Template-Funktion zu instanziiert.

1

Ihr Anspruch, dass static_cast verwendet werden kann, um explizit eine "normale" Überlast auszuwählen, ist geringfügig. Es ist möglich, die folgend in der heutigen C++ zu schreiben:

template<typename P, EnableIf<NullablePointer<P>>...> 
void foo(P&); 

template<typename It, EnableIf<Iterator<It>>...> 
void foo(It&); 

Unter der Annahme, dass NullablePointer und Iterator ausführen Konzept Überprüfung für die zugehörigen Standardkonzepte, dann hat int* q; foo(q); keine Hoffnung auf Kompilieren weil int* ist sowohl ein Modell von NullablePointer und von Iterator (und kein Konzept subsumiert das andere).Es gibt nichts Offensichtliches zu static_cast, um mit dieser Situation zu helfen.

Mein Beispiel (that you can test for yourself) ist äußerst relevant, da diese Art von Code von Concepts Lite formalisiert werden soll. Die Überlast Set Sie präsentieren entspricht:

template<typename A> 
    requires ConceptA<A> 
void foo(A& arg); 

template<typename B> 
    requires ConceptB<B> 
void foo(B& arg); 

Beachten Sie die Ähnlichkeit zwischen den requires Klauseln und den EnableIf ‚Klauseln‘.

+0

Es ist natürlich nichts falsch daran, die Frage zu stellen, ob die Sprache mir einen Weg bieten soll, solche zweideutigen Anrufe zu entschlüsseln. –