gpt4 book ai didi

c++ - 适用于任何支持运算符*的 remove_pointer 模拟

转载 作者:太空狗 更新时间:2023-10-29 20:40:25 26 4
gpt4 key购买 nike

我想要一些语义类似于 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 和/或类型特征来实现。 this question的答案描述如何测试特定类型是否具有特定成员,我想我可以将这些建议之一与 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;

关于c++ - 适用于任何支持运算符*的 remove_pointer 模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24314727/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com