2017-04-21 2 views
0

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?

Répondre

0

Je viens de découvrir que cela fonctionne si vous désintégrez le type du membre statique constexpr pour supprimer les qualificatifs cv.

static_assert(is_specialization<std::decay_t<decltype(foo::z)>, bar>{});