D
@Th69 sagte in [Gelöst] Prüfen, ob eine Klasse eine Instanziierung eines Templates ist:
@DNKpp sagte in [Gelöst] Prüfen, ob eine Klasse eine Instanziierung eines Templates ist:
@firefly sagte in [Gelöst] Prüfen, ob eine Klasse eine Instanziierung eines Templates ist:
Wobei hier eher das problem ist dass das template std::array keine basis klasse hat. Den typ std::array gibt es nicht. Was auch die Fehlermeldung aussagt:
Das geht natürlich nicht, weil std::array kein Typ ist, sondern ein Template.
Das ist aber eben nur bei Templates mit numerischen Nicht-Typen Parametern (NTTP) so. Bei Templates wie std::vector oder std::list erkennt der Compiler dies als Typ (wie im von @DocShoe eingangs verlinkten Artikel Check if a type is an instantiation of a given class template):
is_instance_of_v<std::vector<int>,std::vector>; // true
is_instance_of_v<std::vector<int>,std::list>; // false
Und dies empfinde ich eben als nicht konsistent vom C++ Standard.
Nein, auch hier hast du keine Garantie. Man könnte sicherlich auch meine Lösung in diese Richtung biegen, jedoch ist die nich vollständig funktional. Beide Strategien sind für den normalen Use-Case gleichwertig. Problematisch wird es jedoch, wenn Aliasse ins Spiel kommen. Wärend gcc solche Konstrukte generell nach den Erwartungen auflöst (ein Alias ist gleichwertig zu dem Original), sperrt sich clang (und iirc auch der msvc) dagegen. Daher auch meine Empfehlung, das Problem auf die gezeigte Art und Weise zu lösen.
Hier ein Beispiel:
template <typename T, typename Alloc = std::allocator<T>>
using my_vector = std::vector<T, Alloc>;
static_assert(is_instance_of_v<std::vector<int>, my_vector>);
Das compiled unter gcc, failed allerdings unter clang;
während
template<std::int64_t num, std::int64_t den>
using Derived1Alias = Derived1<num, den>;
static_assert(is_specialisation_of_v<Derived1<1,1>, Derived1Alias>);
auf allen Compilern unproblematisch ist.
https://godbolt.org/z/zTorcvbnn