首页 > 解决方案 > 我可以在这种情况下短路特征吗?

问题描述

考虑以下内容:

#include <type_traits>

template <typename E>
using is_scoped_enum = std::integral_constant<
    bool,
    std::is_enum_v<E> && !std::is_convertible_v<E, std::underlying_type_t<E>>
>;

template <typename E>
constexpr auto is_scoped_enum_v = is_scoped_enum<E>::value;void foo() {}



class Foo {};
enum Bar {};
enum class Baz {};

//static_assert(!is_scoped_enum_v<Foo>);
static_assert(!is_scoped_enum_v<Bar>);
static_assert(is_scoped_enum_v<Baz>);

注释掉的行中断了构建,因为Foo它不是枚举,因此没有基础类型。当然,&&(即使它在一个常量表达式中)并没有缩短对std::underlying_type_t<E>有效的需求。

我是否需要创建一些标记类型和链接 enable_if 的怪物,或者我是否缺少一些微不足道的修复?

标签: c++enumsc++17template-meta-programmingtypetraits

解决方案


推荐阅读