gpt4 book ai didi

c++ - 转换构造函数上的enable_if(静态转换,is_base_of)

转载 作者:行者123 更新时间:2023-12-01 14:39:53 29 4
gpt4 key购买 nike

我正在研究共享指针的实现。 (使用C++ 17,以防万一)

唯一的问题是转换构造函数。我希望能够将smart_ptr静态转换为基本类型的smart_ptr。

template<typename U>
inline smart_ptr(const smart_ptr<U>& rhs)
{
...
}

它可以工作,但是也将尝试将smart_ptr强制转换为任何其他类型的smart_ptr。例如,如果我有一个可以使用不同类型的不相关类型的smart_ptr的重载函数,则会收到有关模棱两可的重载的编译器错误。因此,如果U是T的派生类,我只希望从smart_ptr-> smart_ptr进行转换。

这看起来应该可以工作。它可以编译,但是却相反。它阻止了有效的静态广播,但仍允许强制转换为不相关的类型:
template<typename U>
inline local_shared_ptr(typename enable_if<is_base_of<T,U>::value, const local_shared_ptr<U>&>::type rhs)
{
...
}

编辑:

一切正常,谢谢您的帮助。我选择jarod的解决方案,因为我发现 template <typename U, enable_if_t<is_base_of<T,U>::value, int> = 0>最简洁。我没有意识到SFINAE可以这么简明。

此外,由于内森提到过:

有趣的是,我遇到的一个问题是,我希望当右侧为相同类型时会调用模板副本构造函数。显然,编译器不认为它是复制构造函数的实现,而是调用了自动生成的复制构造函数。 move构造函数和operator =的问题相同。不知道这是否是MSVC2019的错误。

最佳答案

U是不可推论的

template<typename U>
local_shared_ptr(enable_if_t<is_base_of<T,U>::value, const local_shared_ptr<U>&> rhs)
{
// ...
}

由于它是构造函数,因此您甚至无法显式提供模板。
这样那个构造函数就没用了。

您可以改用:
  • 默认参数(与您尝试的IMO最相似):
    template <typename U>
    local_shared_ptr(const local_shared_ptr<U>& rhs, enable_if_t<is_base_of<T,U>::value, int> = 0)
    {
    // ...
    }
  • 默认模板参数(首选方式):
    template <typename U, enable_if_t<is_base_of<T,U>::value, int> = 0>
    local_shared_ptr(const local_shared_ptr<U>& rhs)
    {
    // ...
    }

  • 使用构造函数时,不能使用返回值。

    关于c++ - 转换构造函数上的enable_if(静态转换,is_base_of),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60265596/

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