如何将 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>>;