如何将 std::remove_pointer 与 void* 一起使用?
How to use std::remove_pointer with void*?
我是这样使用std::unique_ptr
的:
template <typename Pointer, auto deleter>
using my_unique_ptr = std::unique_ptr<std::remove_pointer<Pointer>, std::integral_constant<decltype(deleter), deleter>>;
它似乎在 Pointer = void*
时有效,但是当尝试在 my_unique_ptr
上使用重置时,我收到此错误:
invalid conversion from 'SampleType' {aka 'void*'} to 'std::unique_ptr<std::remove_pointer<void*>, std::integral_constant<...> >::pointer' {aka 'std::remove_pointer<void*>*'}
std::remove_pointer<void*>*
不应该自动表示 void*
吗?
您的 my_unique_ptr<void*>
不包含 void*
。它包含一个 std::remove_pointer<void*>*
.
Shouldn't std::remove_pointer<void*>*
automatically mean void*
?
std::remove_pointer
类型并不神奇。它和其他类型一样。这是一个可能的实现:
template<typename T>
struct remove_pointer {
using type = T;
};
template<typename T>
struct remove_pointer<T*> {
using type = T;
};
如您所见,正如您定义的那样,std::unique_ptr
包含指向该结构的指针,就像提到的编译器错误一样。
您可能想做的是使用结构的成员 ::type
,也就是 remove_pointer
元函数的结果:
template <typename Pointer, auto deleter>
using my_unique_ptr = std::unique_ptr<typename std::remove_pointer<Pointer>::type, std::integral_constant<decltype(deleter), deleter>>;
对于 C++14,有一个别名可以简化:
template <typename Pointer, auto deleter>
using my_unique_ptr = std::unique_ptr<std::remove_pointer_t<Pointer>, std::integral_constant<decltype(deleter), deleter>>;
我是这样使用std::unique_ptr
的:
template <typename Pointer, auto deleter>
using my_unique_ptr = std::unique_ptr<std::remove_pointer<Pointer>, std::integral_constant<decltype(deleter), deleter>>;
它似乎在 Pointer = void*
时有效,但是当尝试在 my_unique_ptr
上使用重置时,我收到此错误:
invalid conversion from 'SampleType' {aka 'void*'} to 'std::unique_ptr<std::remove_pointer<void*>, std::integral_constant<...> >::pointer' {aka 'std::remove_pointer<void*>*'}
std::remove_pointer<void*>*
不应该自动表示 void*
吗?
您的 my_unique_ptr<void*>
不包含 void*
。它包含一个 std::remove_pointer<void*>*
.
Shouldn't
std::remove_pointer<void*>*
automatically meanvoid*
?
std::remove_pointer
类型并不神奇。它和其他类型一样。这是一个可能的实现:
template<typename T>
struct remove_pointer {
using type = T;
};
template<typename T>
struct remove_pointer<T*> {
using type = T;
};
如您所见,正如您定义的那样,std::unique_ptr
包含指向该结构的指针,就像提到的编译器错误一样。
您可能想做的是使用结构的成员 ::type
,也就是 remove_pointer
元函数的结果:
template <typename Pointer, auto deleter>
using my_unique_ptr = std::unique_ptr<typename std::remove_pointer<Pointer>::type, std::integral_constant<decltype(deleter), deleter>>;
对于 C++14,有一个别名可以简化:
template <typename Pointer, auto deleter>
using my_unique_ptr = std::unique_ptr<std::remove_pointer_t<Pointer>, std::integral_constant<decltype(deleter), deleter>>;