J'ai besoin d'un trait de type qui détermine si une classe est une spécialisation d'un modèle donné. This answer fournit une implémentation qui fonctionne dans la plupart des cas. Cependant, cela ne semble pas fonctionner pour les types de membres constexpr statiques. Dans l'exemple suivant (également disponible sur wandbox), le dernier static_assert échoue sur le tronc Clang et GCC:Caractère de type is_specialization pour un membre constexpr statique
#include <type_traits>
// from https://stackoverflow.com/questions/16337610/how-to-know-if-a-type-is-a-specialization-of-stdvector
template<typename Test, template<typename...> class Ref>
struct is_specialization : std::false_type {};
template<template<typename...> class Ref, typename... Args>
struct is_specialization<Ref<Args...>, Ref>: std::true_type {};
template<typename T>
struct bar {
bool x;
};
struct foo {
bar<int> y;
static constexpr bar<bool> z{true};
};
int main() {
static_assert(is_specialization<decltype(foo::y), bar>{});
static_assert(is_specialization<decltype(foo::z), bar>{});
}
J'ai deux questions: est-ce bon comportement, et comment puis-je écrire un trait de type qui fonctionne lorsque Je me réfère au type d'un membre constexpr statique?