静态constexpr成员的is_specialization类型特征

时间:2017-04-21 15:26:55

标签: c++ metaprogramming template-specialization typetraits

我需要一个类型特征来确定某个类是否是给定模板的特化。 This answer提供了一种适用于大多数情况的实现。

但是,它似乎不适用于静态constexpr成员类型。在以下示例中(也可在wandbox上获得),最后一个static_assert在Clang和GCC trunk上失败:

#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>{});
}

我有两个问题:这是正确的行为吗?如何在我引用静态constexpr成员的类型时编写一个类型特征?

1 个答案:

答案 0 :(得分:0)

我刚刚发现,如果你衰减静态constexpr成员的类型来剥离cv限定符,那就有效。

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