static_assert用于任何类型的unique_ptr

时间:2016-06-22 15:28:00

标签: c++ static-assert

我如何静态断言表达式为std::unique_ptr,即std::unique_ptr<T> T

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

以上不起作用。如果没有直截了当,我只对定义类型的bool()运算符感兴趣。

3 个答案:

答案 0 :(得分:6)

创建自己的特征,并使用适当的部分特化:

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
{};

答案 1 :(得分:3)

您可以为此创建特征:

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

答案 2 :(得分:1)

您可以使用:

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时,才会出现这种情况。