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
进行比较。只有当 expr
是 std::unique_ptr
.
时,这才会成立
我如何静态断言表达式是 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
进行比较。只有当 expr
是 std::unique_ptr
.