Gio*_*ani 8 c++ static-assert c++14
我有这个 C++14 代码:
#include <type_traits>
struct f1 {
enum struct e { a };
};
struct f2 {
enum struct e {};
};
template <typename T>
struct my_struct {
using e = typename T::e;
my_struct()
: _e{e::a} {} // e::a used here
e _e;
};
int main() {
my_struct<f1> a;
my_struct<f2> b; // compilation fails
}
Run Code Online (Sandbox Code Playgroud)
显然,编译失败,类似于'a' is not a member of 'my_struct<f2>::e'. 我真的很想向 中添加一些静态断言my_struct,以添加自定义错误消息。首先,我可以检查是否e实际上是一个枚举:
static_assert(std::is_enum<e>::value, "my message");
Run Code Online (Sandbox Code Playgroud)
那么,我应该添加什么来静态断言e::a定义的?
与检测任何嵌套声明的方式相同:
template <typename T, typename = void>
struct enum_defines_a : std::false_type {};
template <typename T>
struct enum_defines_a<T, decltype(void(T::a))> : std::is_enum<T> {};
static_assert(enum_defines_a<e>::value, "Enum doesn't define 'a'");
Run Code Online (Sandbox Code Playgroud)