Mein Verständnis über den Template argument deduction for class templates Vorschlag war, das Verhalten von Template-Funktionen und Template-Klassen in Deduktionskontexten zu homogenisieren. Aber ich denke, dass ich etwas falsch verstanden hätte.C++ 17 Klassenvorlage Teilabzug
Wenn wir diese Vorlage bezweckt:
template <std::size_t S, typename T>
struct test
{
static constexpr auto size = S;
using type_t = T;
test(type_t (&input)[size]) : data(input) {}
type_t (&data)[size]{};
};
Ich neige dazu, eine Hilfsfunktion als syntaktischen Zucker verwenden zur Erstellung test
Objekte:
template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }
, die unten wie gezeigt verwendet werden können:
int main()
{
int buffer[5];
auto a = helper<5, int>(buffer); // No deduction
auto b = helper<5>(buffer); // Type deduced
auto c = helper(buffer); // Type and size deduced
std::cout << a.size << b.size << c.size;
return 0;
}
Die Code über die Ausgänge 555
wie erwartet. Ich habe das gleiche in Wandbox versucht, den neueren Compiler Setup mit:
int main()
{
int buffer[5];
test<5, int> a(buffer); // No deduction: Ok.
test<5> b(buffer); // Type deduced: FAILS.
test c(buffer); // Type and size deduced: Ok.
std::cout << a.size << b.size << c.size;
return 0;
}
Es ist wie für Klassenvorlagen Vorlage Argument Abzug sieht funktioniert nur alle Parameter herzuleiten, war ich beiden Verhaltensweisen erwartet (Helferfunktion und Klasse Vorlage), um dasselbe zu sein, habe ich etwas falsch verstanden?
Die letzten Compilern availables in Wandbox sind gcc HEAD 7.0.1 201701 und Klirren HEAD 5.0.0 (trunk).
Ist 'type_t (& Daten) [size] {};' ein Referenzfeld? Ist das '{}' ein Initialisierer? Kompiliert das? Auch * sintaktischer Zucker * klingt ziemlich ungezogen. :) – wally
Beachten Sie, dass [das Hinzufügen eines expliziten * Deduktionsleitfadens] (http://melpon.org/wandbox/permlink/VEE5DyIE3w3LEGEX) nicht hilft.Ich glaube, dass Teilabzug nicht unterstützt wird, da der Standard einen Abzug-Platzhalter in Form eines * Vorlagennamens * * definiert (d. H. Ohne '<...>' Syntax) *. Daher ist "test <5>" kein gültiger Deduktions-Platzhalter. –
@Muscampester 'type_t (& data) [Größe] {};' ist eine Array-Referenz, ja. Das '{}' ist in der Tat der Initialisierer, und es kompiliert [probieren Sie es aus!] (Http://melpon.org/wandbox/permlink/KCkDg5EEIKbZbPU3). Über * sintactic sugar * was soll ich sagen ...: '(Englisch ist nicht meine Mutter tonghe und ich mache viele Fehler! –