这些是模板constexpr布尔,用于检查某些类型是否是std::optional
的实例化
template<typename> constexpr bool is_optional = false;
template<typename T> constexpr bool is_optional<std::optional<T>> = true;
template<typename T> constexpr bool is_optional<std::optional<T>&> = true; // avoid this
static_assert(not is_optional<int>);
static_assert(is_optional<std::optional<int>>);
static_assert(is_optional<std::optional<int>&>);
为了详尽无遗,我需要补充
template<typename T> constexpr bool is_optional<std::optional<T>const&> = true; // avoid this
template<typename T> constexpr bool is_optional<std::optional<T>&&> = true; // avoid this
template<typename T> constexpr bool is_optional<std::optional<T>const> = true; // avoid this
可能还有挥发物。 看起来太累赘了。
有没有一种方法只声明一个变量为真大小写?
在C++20中,您可以使用std::remove_cv_ref_t
和一点间接操作来轻松完成此操作:
template<typename> constexpr bool is_optional_impl = false;
template<typename T> constexpr bool is_optional_impl<std::optional<T>> = true;
template<typename T>
constexpr bool is_optional = is_optional_impl<std::remove_cvref_t<T>>;
这将处理const
,volatile
和&
限定符。
这是一个演示。
在C++20之前,你得再露骨一点,像这样:
template<typename T>
constexpr bool is_optional =
is_optional_impl<std::remove_cv_t<std::remove_reference_t<T>>>;
这是一个演示。