Remove_pointer类比,适用于任何支持operator*的对象
remove_pointer analog that works for anything that supports operator*
我想有类似于std::remove_pointer
语义的东西,但除了真指针外,还适用于指针类。当然,我可以列举已知的可能性:
// Important: remove_pointer_ex<T>::type should evaluate to T
// if T::operator* is not defined (like std::remove_pointer)
template<typename T> struct remove_pointer_ex { typedef T type; };
template<typename T> struct remove_pointer_ex<T*> { typedef T type; };
template<typename T> struct remove_pointer_ex<std::shared_ptr<T>> { typedef T type; };
template<typename T> struct remove_pointer_ex<std::unique_ptr<T>> { typedef T type; };
// and then again for all the different cv combinations
但是我真的想要一种方法,可以与任何支持operator*
的类一起工作。
似乎这应该是可行的使用SFINAE和/或类型特征。这个问题的答案描述了如何测试一个特定的类型是否有一个特定的成员,我想我可以使用其中一个建议结合enable_if
,但坦率地说,如果没有不那么难看的方法来解决这个问题,我宁愿尝试一个完全不同的方法。
使用默认为T
的类型特征,但在有效时更喜欢std::remove_reference<decltype(*T)>
(Live at Coliru):
template <typename T>
class remove_pointer_ {
template <typename U=T>
static auto test(int) -> std::remove_reference<decltype(*std::declval<U>())>;
static auto test(...) -> std::remove_cv<T>;
public:
using type = typename decltype(test(0))::type;
};
template <typename T>
using remove_pointer = typename remove_pointer_<T>::type;
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 为什么 std::optional::operator=(U&&) 要求你是非标量类型?
- 'operator='已弃用:改用 QDir::setPath()
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 过载'operator new'如何导致无限循环?
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 处理"no operator found"
- 如何编写 operator= 用于使用虚拟方法与非平凡成员的匿名联合
- 为什么字符串支持`operator=(char)`
- Remove_pointer类比,适用于任何支持operator*的对象
- OpenCV Mat::operator=-是否支持写时复制