static_assert 对于任何类型的 unique_ptr

static_assert for unique_ptr of any type

我如何静态断言表达式是 std::unique_ptr,即 std::unique_ptr<T> 对于任何 T

static_assert (std::is_pointer<decltype(exp)>()), "not a smart pointer")

以上方法无效。如果没有什么直接的,我只对为类型定义 bool() 运算符感兴趣。

通过适当的部分专业化创建您自己的特征:

template <class T>
struct is_unique_ptr : std::false_type
{};

template <class T, class D>
struct is_unique_ptr<std::unique_ptr<T, D>> : std::true_type
{};

您可以为此创建特征:

template <typename T, typename D>
std::true_type is_unique_ptr_impl(const std::unique_ptr<T, D>&, int);

template <typename T>
std::false_type is_unique_ptr_impl(const T&, ...);

template <typename T>
using is_unique_ptr = decltype(is_unique_ptr_impl(std::declval<T>(), 0));

你可以使用这个:

static_assert(std::is_same<decltype(expr),
    std::unique_ptr<std::remove_pointer<decltype(expr.get())>::type>>::value, "");

基本上,它所做的是从 std::unique_ptr::get() 的类型中创建一个 std::unique_ptr,并将其与 expr 进行比较。只有当 exprstd::unique_ptr.

时,这才会成立