gpt4 book ai didi

c++ - 如何检查类型是智能指针还是对智能指针的引用

转载 作者:行者123 更新时间:2023-12-02 10:06:20 25 4
gpt4 key购买 nike

我正在尝试实现一种结构,该结构在编译时检查给定类型是智能指针还是智能指针的引用。

我重写了this解决方案(不适用于引用):

template<typename T, typename Enable = void>
struct IsSmartPointer : std::false_type {
};

template<typename T>
struct IsSmartPointer<T,
typename std::enable_if<
std::is_same<
typename std::decay_t<T>, std::unique_ptr<typename std::decay_t<T>::element_type>
>::value
>
> : std::true_type {
};

template<typename T>
struct IsSmartPointer<T,
typename std::enable_if<
std::is_same<
typename std::decay_t<T>, std::shared_ptr<typename std::decay_t<T>::element_type>
>::value
>
> : std::true_type {
};

template<typename T>
struct IsSmartPointer<T,
typename std::enable_if<
std::is_same<
typename std::decay_t<T>, std::weak_ptr<typename std::decay_t<T>::element_type>
>::value
>
> : std::true_type {
};

我觉得这种实现非常接近正确的解决方案。但是,下面的代码显示零:

std::cout << IsSmartPointer<int>::value                          << '\n'
<< IsSmartPointer<const std::shared_ptr<int> &>::value << '\n'
<< IsSmartPointer<std::shared_ptr<int> &>::value << '\n'
<< IsSmartPointer<const std::shared_ptr<int>>::value << '\n'
<< IsSmartPointer<std::shared_ptr<int>>::value
<< std::endl;

你能因为我用完了点子而试图找到一个错误吗?

最佳答案

您写了std::enable_if<...>,应该是std::enable_if_t<...>std::enable_if<...>::type
std::enable_if<...>是一种绝对不会成为void的独特类型。因此,如果第二个模板参数默认为void,则将永远不会使用您的部分特化知识。

另请注意,您忘记了自定义删除器。 std::unique_ptr具有用于自定义删除程序类型的第二个模板参数,如果未将其指定为默认值,则不会捕获。

关于c++ - 如何检查类型是智能指针还是对智能指针的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60026054/

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