提问者:小点点

检查某些类型是否是模板类std::optional的实例


这些是模板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

可能还有挥发物。 看起来太累赘了。

有没有一种方法只声明一个变量为真大小写?


共1个答案

匿名用户

在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>>;

这将处理constvolatile&限定符。

这是一个演示。

在C++20之前,你得再露骨一点,像这样:

template<typename T> 
constexpr bool is_optional = 
  is_optional_impl<std::remove_cv_t<std::remove_reference_t<T>>>;

这是一个演示。