Ist es möglich zu testen, ob einige Typen über SFINAE an einen Vorlagenparameter gebunden werden können?Verwenden Sie SFINAE, um zu prüfen, ob Typen an Vorlagenvorlagenparameter gebunden werden können
Ich denke, was ich versuche, am besten zu tun ist, mit dem folgenden Beispielcode erläutert:
#include <iostream>
template<typename... T> using void_t = void;
template<typename T> struct TemporaryBindObject
{
using type = TemporaryBindObject<T>;
};
template<template<typename...> class Dest> struct TestValidBind
{
template<typename... Ts> struct toTypesOf
{
using type = std::false_type;
};
template<template<typename...> class Src, typename... Ts> struct toTypesOf<Src<Ts...>, void_t<Dest<Ts...,float>>>
{
using type = std::true_type;
};
};
template<typename T> struct OneParamStruct{};
template<typename T1, typename T2> struct TwoParamStruct{};
int main()
{
using tmp = TemporaryBindObject<int>;
std::cout << "Can bind to TwoParamStruct: " << TestValidBind<TwoParamStruct>::toTypesOf<tmp>::type::value << std::endl;
std::cout << "Can bind to OneParamStruct: " << TestValidBind<OneParamStruct>::toTypesOf<tmp>::type::value << std::endl;
}
Zuerst habe ich eine temporäre Art machen tmp
aus dem ich die Template-Parameter int
zu binden es in eine andere Klasse nehmen wollen Vorlage. Mit der TestValidBind<template template type>::toTypesOf<typename>
möchte ich testen, ob es möglich ist, den Parameter des angegebenen Typs an die template template parameter
und zu binden und einen zusätzlichen Typ anzufügen (float
in dem Beispiel).
Was ich will, ist, dass TestValidBind<TwoParamStruct>::toTypesOf<tmp>::type
ist true_type
während TestValidBind<OneParamStruct>::toTypesOf<tmp>::type
false_type
ist.
Das Codebeispiel, wie es mit g++ -std=c++11
(5.3.1) mit dem folgenden Fehler nicht kompilieren ist:
../test_SFINAE_with_template_binding.cc: In function ‘int main()’: ../test_SFINAE_with_template_binding.cc:34:96: error: ‘TestValidBind<OneParamStruct>::toTypesOf<TemporaryBindObject<int> >::type’ has not been declared
und Berichte false_type
(was falsch ist), wenn die OneParamStruct
Linie entfernt wird.
Mit clang++ -std=c++11
(3.8.0) kompiliert der Code aber Berichte false_type
in beiden Fällen.
Ist so etwas überhaupt möglich?
Edit: Changed die zusätzliche Art von void
zu float
betonen, dass ich, wenn die zusätzliche Art überprüfen möchten möglich ist.
Danke für Ihre gültigen Korrekturen. Eigentlich beantwortet es meine Frage nicht genau. Ich habe nach dem Gegenteil gefragt, das immer noch nicht funktioniert (wahrscheinlich war mein Beispiel nicht gut darauf zugeschnitten, den Punkt hervorzuheben). Was ich versuchen wollte, war einen zusätzlichen Typ hinzuzufügen (den ich als "ungültig" auswählte). Ich werde es in etwas anderes ändern, um diesen Punkt hervorzuheben. – havogt
Ich war ein bisschen zu schnell mit meinem Kommentar: Mein Beispiel (mit einem Typ zu viele) mit Ihren Korrekturen funktioniert jetzt mit clang, schlägt aber immer noch mit g ++ 5 fehl. Ihr Beispiel funktioniert in beiden Compilern. – havogt
Ich werde meine Frage an Ihre Antwort anpassen (weil Sie tatsächlich einen dummen Fehler behoben haben) und morgen eine neue Frage stellen. Aber lassen Sie mich beachten, dass ich meine Frage mit dem Schnitt nicht geändert habe! – havogt