2016-09-27 2 views
8

Mit dem kommenden C++ 17 Merkmale non-type template arguments with auto, wird es möglich sein std::function so zu implementieren, in der Lage sein, zum Beispiel zu setzen, wird die folgenden Funktionen:Werden C++ 17 Vorlagenargumente mit Auto-Feature eingeschränkte std :: function-Objekte zulassen?

bool f(int n, double d) {}  
    bool g(bool b, char c) {} 
    bool h(bool b)   {} 

in Auto-Templat std::function Objekte:

std::function<bool(auto, auto)> faa = f; // ok 
    std::function<bool(int, auto)> fia = f; // ok 
    std::function<bool(double, auto)> fda = f; // error: function type mismatch 
    std::function<bool(auto, auto)> gaa = g; // ok 
    std::function<bool(auto, auto)> haa = h; // error: function type mismatch 
    std::function<bool(auto)>   ha = h; // ok 

Und so weiter.

Mit anderen Worten, std::function Objekte eingeschränkt auf die Funktionstypen akzeptieren sie?

(derzeit auf GCC bekommen wir ein error: 'auto' parameter not permitted in this context.)

+0

Wie würden Sie eine 'std :: function ' nennen, vorausgesetzt, dass so etwas existiert? –

+0

@ n.m .: Sehr, sehr vorsichtig. –

+0

@LightnessRacesinOrbit im Gegensatz zu den üblichen schlampigen Aufruf von Pre-C++ 17 Funktionen? –

Antwort

7

Das sind keine nicht-Typ Vorlage Argumente, so auto ist dort nicht erlaubt in C++ 17.

Nicht typisierte Vorlagenargumente sind Argumente für Vorlagen, die Zeiger oder Ganzzahlen oder ähnliche, tatsächliche Werte, keine Typen sind.

Ein Beispiel

std::integral_constant<std::size_t, 7>; 

hier die 7 ist ein Argument der Vorlage nicht-Typ Typ std::size_t und Wert 7.

Nicht Typ Vorlage auto erlaubt so etwas wie:

template<auto x> 
using integral = std::integral_constant< decltype(x), x >; 

jetzt ist integral<7>std::integral_constant<int, 7>.

Auf der anderen Seite ist Ihre Verwendung von auto statt einer Typ, kein Nicht-Typ.


Es ist ein Merkmal, in dem die Art der Vorlage abgeleitet wird, so könnte man schreiben:

std::function faa = f; 

wenn sie std::function Augmented Lage sein, eine Signatur von einem Funktionszeiger abzuleiten (oder nicht -Tabelle aufrufbar).

Beachten Sie jedoch, dass diese std::function eine feste Signatur haben würde, keine Vorlage. Die Funktion ermöglicht einfach Abzug, nicht Vorlage dynamischen Versand.

Ich weiß nicht, ob std::function auf diese Weise in C++ 17 erweitert wurde, aber die Sprachfunktion wurde hinzugefügt.

+0

* "Vorlage dynamische Versand" * oh Herr ...Ich hoffe, dass diese Sache nie existiert –

+0

@GuillaumeRacicot Einfach einen Compiler, eine Abstraktion der Quelle, und verlangen, dass der Aufrufer die gleichen für die Vorlage Argumente übergeben übergeben. Kompilieren Sie es und Memoize die Zusammenstellung während des Versands. Kinderleicht! Scripting/Bytecode-Sprachen tun es immer (normalerweise mit weniger Energie als C++ - Vorlagen). – Yakk

Verwandte Themen