Normalerweise, wenn ich Templates schreibe, die spezialisiert sind, verwende ich zuerst eine Forward-Deklaration und deklariere die Fälle als Spezialisierungen. In Ihrem Fall verstehe ich, dass Sie versuchen, eine variadische Vorlage ohne den leeren Fall zu schreiben (dh eine variadische Vorlage, die mindestens einen Typ haben könnte).
Ihr Code überraschte mich, weil ich denke, dass Sie richtig sind, passt die volle variadic Spezialisierung Ihres Merkmals den Loch Fällen ... Zuerst habe ich versucht, eine Vorwärtsdeklaration Ihrer Merkmalklasse zu verwenden, und definieren Sie NUR die volle Variadic Spezialisierung (Wenn also der Parameter des Merkmals keine Wrapper
Instanz ist, schlägt die Kompilierung fehl). Und das ist genau das, was hat aufgetreten, mich wieder enttäuschend:
#include <iostream>
#include <utility>
template<typename F , typename... T>
struct Wrapper {};
template<typename T>
struct is_wrapper;
//template<typename T>
//struct is_wrapper : std::false_type {};
template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};
//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};
using my_wrapper_type = Wrapper<int,double>;
int main()
{
std::cout << std::boolalpha << is_wrapper<my_wrapper_type>::value << std::endl;
}//"Invalid use of incomplete type" ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Schließlich habe ich versucht, mit der Forward-Deklaration Methode in der Wrapper
Klasse. Und überraschend, dass es funktioniert:
#include <iostream>
#include <utility>
template<typename... T>
struct Wrapper;
template<typename F, typename... T>
struct Wrapper<F,T...>{ };
template<typename T>
struct is_wrapper : std::false_type {};
template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};
//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};
using my_wrapper_type = Wrapper<int,double>;
int main()
{
std::cout << std::boolalpha << is_wrapper<my_wrapper_type>::value << std::endl;
}
Diese Drucke:
wahr
Here ist der Code bei ideone läuft.
Mit freundlichen Grüßen, ich verstehe nicht, warum Ihr Code fehlschlägt und meins funktioniert. Es ist ein Compiler-Bug, oder gibt es etwas, was uns fehlt? Ich weiß es nicht.
Der Unterschied ist die Anzahl der Template-Parameter für die Klassenvorlage 'Wrapper'. Ihre (zweite) Version hat nur einen Template-Parameter, während die OP-Version zwei Parameter hat. Ihre partielle Spezialisierung 'struct Wrapper' ändert das nicht. –
dyp
@DyP OK, aber wenn Sie eine Vorlage mit zwei Parametern haben (Ein normaler Vorlagenparameter und ein variadischer Vorlagenparameter) und Sie ein Variadic-Paket an diese Vorlage übergeben, muss das Variadic-Paket nicht entsprechend dem ersten normalen Parameter erweitert werden. und der zweite Parameter (Variadic Parameter)?Das ist, was ich nicht verstehe, warum das Paket nicht auf diese Weise erweitert wird. – Manu343726
Ich versuche immer noch herauszufinden, wo (und warum) der Standard verbietet, dass die Teilspezialisierung in diesem Fall mit dem Parameter-Paket übereinstimmt. Schätze, es ist irgendwo um [temp.educt.type]/9 herum. (Pack-Erweiterung unterscheidet sich von der Ableitung.) – dyp