Ich möchte prüfen, ob eine bestimmte Template-Spezialisierung existiert oder nicht, bei der der allgemeine Fall nicht definiert ist.
Gegeben:
template <typename T> struct A; // general definition not defined
template <> struct A<int> {}; // specialization defined for int
Ich möchte eine Struktur wie folgt definieren:
template <typename T>
struct IsDefined
{
static const bool value = ???; // true if A<T> exist, false if it does not
};
Gibt es eine Möglichkeit, dies zu tun (idealerweise ohne C++ 11)?
Vielen Dank

QUentin
Ausnutzen der Tatsache, dass man sich nicht bewerben kann sizeof
zu einem unvollständigen Typ:
template <class T, std::size_t = sizeof(T)>
std::true_type is_complete_impl(T *);
std::false_type is_complete_impl(...);
template <class T>
using is_complete = decltype(is_complete_impl(std::declval<T*>()));
Sehen Sie es live auf Coliru
Hier ist eine etwas klobige, aber funktionierende C++03-Lösung:
template <class T>
char is_complete_impl(char (*)[sizeof(T)]);
template <class>
char (&is_complete_impl(...))[2];
template <class T>
struct is_complete {
enum { value = sizeof(is_complete_impl<T>(0)) == sizeof(char) };
};
Sehen Sie es live auf Coliru
Dies ist eine alternative Implementierung, die immer denselben Trick verwendet, den @Quentin verwendet hat
C++11-Version
template<class First, std::size_t>
using first_t = First;
template<class T>
struct is_complete_type: std::false_type {};
template<class T>
struct is_complete_type<first_t<T, sizeof(T)>> : std::true_type {};
Beispiel auf Zauberstabbox
Vorläufige C++03-Version, die nicht funktioniert
template<typename First, std::size_t>
struct first { typedef First type; };
template<typename T>
struct is_complete_type { static const bool value = false; };
template<typename T>
struct is_complete_type< typename first<T, sizeof(T)>::type > { static const bool value = true; };
Der Fehler ist in diesem Fall
prog.cc:11:8: Fehler: Template-Parameter bei partieller Spezialisierung nicht ableitbar: struct is_complete_type< typename first::type > { static const bool value = true; }; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~
prog.cc:11:8: Anmerkung: ‘T’
10127600cookie-checkSo entscheiden Sie, ob eine Vorlagenspezialisierung vorhanden istyes
Warum sollten Sie das tun? Frage aus Neugier.
– HSmale
28. Mai 2017 um 21:22 Uhr
@HSchmale, das vollständige Problem wird hier beschrieben: stackoverflow.com/questions/44237528/…
– Fabio
29. Mai 2017 um 14:07 Uhr