2016-12-23 15 views
2

Gibt es eine Möglichkeit, dies zu tun? Soweit ich weiß, gibt es nicht, da die Sprache nicht unterstützt, aber ich wollteRückgabetypableitung in einen Vorlagenparameter

template <typename Something> 
ConceptCheck<auto> return_something(const Something& something) { 
    return process_something(something); 
} 

Diese schön in einigen Fällen zu haben, wäre zu bestätigen. Zum Beispiel, wo man die Konzepte, die von einem Rückgabetyp unterstützt werden, dokumentieren möchte (was ansonsten ein einfacher automatischer Vorgang wäre, der den Leser dazu verleitet, anderswo nach Informationen zu suchen).

Wenn dies wie eine anständige Sache zu vorschlagen scheint, möchte ich dies auf den Standard für die Zukunft vorschlagen, kann mir jemand sagen, wie es geht? Sind Rückgabetypen schon im C++ 20-Standard?

Danke!

+0

Ist das wonach Sie suchen? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0238r0.html –

Antwort

2

Sie können einfach alles finden Sie über die laufenden Standardisierungsbemühungen bei https://isocpp.org/

Insbesondere https://isocpp.org/blog/2016/12/2016-11-post-issaquah-mailing-available listet alle Dokumente in der jüngsten Mailing, mit dem Text auf den aktuellen Entwurf von C wissen möchten + +17.

Ich kann Ihnen sagen, dass Concepts nicht in den Entwurf Standard zu diesem Zeitpunkt akzeptiert wurde. Das könnte sich in der nächsten Sitzung ändern.

+0

Entschuldigung! Ich meinte C++ 20, ich werde meine Frage aktualisieren – Curious

+1

@Curious Ich glaube nicht, dass jemand weiß, was C++ 20 an dieser Stelle enthalten wird, da C++ 17 nicht ganz endgültig ist. –

+0

Danke! Ich habe Ihre Antwort aktualisiert, aber ich werde immer noch auf eine Antwort warten, die die anderen Teile der Frage anspricht. – Curious

1

Sie können dafür eine Funktionsdeklaration und einen abschließenden Rückgabetyp verwenden.
Es folgt ein minimales, Arbeitsbeispiel (C++ 14):

#include<type_traits> 

template<typename> 
struct ConceptCheck {}; 

template<typename T> 
T get_it(ConceptCheck<T>); 

ConceptCheck<char> process_something(int) { return {}; } 
ConceptCheck<void> process_something(double) { return {}; } 

template <typename Something> 
auto return_something(const Something& something) 
-> ConceptCheck<decltype(get_it(process_something(something)))> { 
    return process_something(something); 
} 

int main() { 
    static_assert(std::is_same<decltype(return_something(0)), ConceptCheck<char>>::value, "!"); 
    static_assert(std::is_same<decltype(return_something(0.)), ConceptCheck<void>>::value, "!"); 
} 

Nun, ich gebe zu, dass ConceptCheck<auto> schöner wäre als:

ConceptCheck<decltype(get_it(process_something(something)))> 

Wie auch immer, wenn das Ziel das zu dokumentieren, war Rückgabetyp ConceptCheck, egal was der eigentliche Template-Parameter ist, ist dies eine praktikable Lösung.

Wenn Sie nicht wie der Hinterrückgabetyp oder Sie können es nicht dokumentieren für ihn durch Ihre Dokumentation Tool nicht unterstützt wird, können Sie immer noch std::declval verwenden, wie es folgt:

template <typename Something> 
ConceptCheck<decltype(get_it(process_something(std::declval<Something>())))> 
return_something(const Something& something) { 
    return process_something(something); 
} 

Oder noch besser:

template <typename Something, typename T = decltype(get_it(process_something(std::declval<Something>())))> 
ConceptCheck<T> 
return_something(const Something& something) { 
    return process_something(something); 
} 

Der zusätzliche Vorlagenparameter ist ziemlich hässlich, aber der Rückgabetyp ist schließlich ConceptCheck<T>.

Verwandte Themen