shared_dynamic_cast 和dynamic_pointer_cast 之间的区别

发布于 2025-01-08 18:00:07 字数 132 浏览 0 评论 0原文

之间的区别吗

有人可以向我解释Boost 库中的 shared_dynamic_castdynamic_pointer_cast

?在我看来,它们可能是等效的。

Can someone explain to me the difference between:

shared_dynamic_cast and dynamic_pointer_cast from the Boost library?

It appears to me that they may be equivalent.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

此生挚爱伱 2025-01-15 18:00:07

给定一个shared_ptr,这两个函数确实是等价的。

区别在于,shared_dynamic_cast适用于shared_ptr<>,而dynamic_pointer_cast适用于任何类型的指针(通过重载)。这使您能够对任何指针概念执行动态转换,无论该指针的实际组成方式如何:

#include <boost/pointer_cast.hpp>
#include <boost/shared_ptr.hpp>

struct foo {};
struct bar : foo { void f(){} };

template <typename Ptr>
void test(Ptr ptr)
{
    boost::dynamic_pointer_cast<bar>(ptr)->f();
}

int main()
{
    bar b;
    foo* pf = &b;

    std::shared_ptr<foo> spf(new bar());

    test(pf); // turns into dynamic_cast<bar*>(pf)->f();
    test(spf); // turns into shared_dynamic_cast<bar>(pf)->f();
}

因为 dynamic_pointer_cast 具有 shared_dynamic_cast 的功能此外,后一个函数已被弃用。 (同样,在 C++11 中,只存在 dynamic_pointer_cast。)

(当然,对于其他强制转换变体,这个想法也是相同的。)

Given a shared_ptr<T>, the two functions are indeed equivalent.

The difference is that shared_dynamic_cast only works with shared_ptr<>'s, while dynamic_pointer_cast works with any kind of pointer (via overloading). This enables you to perform a dynamic cast on any pointer concept, regardless of how that pointer is actually composed:

#include <boost/pointer_cast.hpp>
#include <boost/shared_ptr.hpp>

struct foo {};
struct bar : foo { void f(){} };

template <typename Ptr>
void test(Ptr ptr)
{
    boost::dynamic_pointer_cast<bar>(ptr)->f();
}

int main()
{
    bar b;
    foo* pf = &b;

    std::shared_ptr<foo> spf(new bar());

    test(pf); // turns into dynamic_cast<bar*>(pf)->f();
    test(spf); // turns into shared_dynamic_cast<bar>(pf)->f();
}

Because dynamic_pointer_cast has the capability of shared_dynamic_cast and more, the latter function is deprecated. (Likewise in C++11, there only exists dynamic_pointer_cast.)

(The idea is the same for the other cast variants too, of course.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文