C++ 检查某个类型是否为模板类std::optional的实例

C++ 检查某个类型是否为模板类std::optional的实例,c++,templates,constexpr,C++,Templates,Constexpr,这些是模板constepr bools,用于检查某个类型是否是std::optional的实例化 为了详尽,我需要补充 template<typename T> constexpr bool is_optional<std::optional<T>const&> = true; // avoid this template<typename T> constexpr bool is_optional<std::optional<

这些是模板constepr bools,用于检查某个类型是否是std::optional的实例化

为了详尽,我需要补充

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
可能还有挥发物。看起来太笨重了

有没有一种方法可以只为true case声明一个变量?

在c++20中,您可以使用,并使用一些间接的方法来轻松地执行此操作:

模板constexpr bool是可选的\u impl=false; 模板constepr bool是可选的\u impl=true; 样板 constexpr bool is_optional=is_optional\u impl; 这将处理常量、volatile和&限定符

这是一个例子

在c++20之前,您必须更加明确,如下所示:

template<typename T> 
constexpr bool is_optional = 
  is_optional_impl<std::remove_cv_t<std::remove_reference_t<T>>>;
在c++20中有一个.

可以使用,还有一点间接的方法来轻松实现:

模板constexpr bool是可选的\u impl=false; 模板constepr bool是可选的\u impl=true; 样板 constexpr bool is_optional=is_optional\u impl; 这将处理常量、volatile和&限定符

这是一个例子

在c++20之前,您必须更加明确,如下所示:

template<typename T> 
constexpr bool is_optional = 
  is_optional_impl<std::remove_cv_t<std::remove_reference_t<T>>>;
这里有一个。

在c++17中,您还可以使用std::decation\t代替std::remove\u cv\u ref\t。此外,您可以考虑为STD::NulLoptTy.< /P>添加专门化。 在c++17中,还可以使用std::decation\u t代替std::remove\u cv\u ref\t。此外,您可以考虑为STD::NulLoptTy.< /P>添加专门化。
C++11模板constexpr bool is_optional=is_optional\u impl@kyb我在答案中添加了这一点,但是您需要在cvs之前删除&before。只是出于好奇,你知道有没有使用Boost的单线解决方案吗?@Evg你的意思是代替上面的三条线吗?我不确定,至少有两行是不可约的。也许有一个实用程序可以在一行中返回true/false,比如is,of,v。这看起来像是一个非常基本的函数,但我找不到任何类似的函数@kyb我在答案中添加了这一点,但是您需要在cvs之前删除&before。只是出于好奇,你知道有没有使用Boost的单线解决方案吗?@Evg你的意思是代替上面的三条线吗?我不确定,至少有两行是不可约的。也许有一个实用程序可以在一行中返回true/false,比如is,of,v。这看起来像是一个非常基本的函数,但我找不到任何类似的函数。
#include <optional>
#include <type_traits>

template<typename>   constexpr bool is_optional_impl = false;
template<typename T> constexpr bool is_optional_impl<std::optional<T>> = true;
template<> constexpr bool is_optional_impl<std::nullopt_t> = true;

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


static_assert(not is_optional<int>);
static_assert(is_optional<std::optional<int>>);
static_assert(is_optional<std::optional<int>&>);
static_assert(is_optional<std::optional<int> const volatile>);
static_assert(is_optional<std::optional<int> const&>);
static_assert(is_optional<std::nullopt_t>);