如何通过std :: unique_ptr成员调用其他类的const成员函数

虚拟软件公司

在阅读有关将const传播包装器添加到标准库的建议(文件号N4388)时,我碰到了本文给出的示例:

#include <memory>
#include <iostream>

struct A
{
    void bar() const
    {
        std::cout << "A::bar (const)" << std::endl;
    }

    void bar()
    {
        std::cout << "A::bar (non-const)" << std::endl;
    }
};

struct B
{
    B() : m_ptrA(std::make_unique<A>()) {}

    void foo() const
    {
        std::cout << "B::foo (const)" << std::endl;
        m_ptrA->bar(); // calls A::bar() (non-const)

        // const_cast<const std::unique_ptr<A>>(m_ptrA)->bar(); // how to call the A::bar() const?
    }

    void foo()
    {
        std::cout << "B::foo (non-const)" << std::endl;
        m_ptrA->bar();
    }

    std::unique_ptr<A> m_ptrA;
};

int main()
{
    const B const_b;
    const_b.foo();
}

输出:

B :: foo(常量)
A :: bar(非常量)

我知道为什么会这样。即使指针是const,它指向的对象也是非常量的,所以确实A::bar调用了非常量成员函数(这是本文建议的全部要点,以避免这种看似尴尬的情况并const通过包装器传播)。此外,他们说,为了避免这种情况,一旦可以const_cast指针m_ptrAB::foo() const,所以它调用所需A::bar() const

我试过无数的组合,但坦率地说,我不知道怎么const_castunique_ptr也就是说,我怎么能在强制执行B::foo() const“正确”的呼叫A::bar() const通过m_ptrA(如果还不清楚我想要什么,请参见代码中的注释)。

StenSoft

您需要const-cast存储的指针,而不是unique_ptr

const_cast<const A*>(m_ptrA.get())->bar();
const_cast<const A&>(*m_ptrA).bar();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将std :: unique_ptr类成员标记为const

无法通过Diamond中的std :: unique_ptr访问最基类的受保护成员变量

如何为包装需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?

如何将unique_ptr的移动构造函数和运算符实现为类的私有成员

错误C2248:'std :: unique_ptr <_Ty> :: unique_ptr':无法访问在类'std :: unique_ptr <_Ty>'中声明的私有成员

构造类成员std :: vector <std :: unique_ptr <AClass>的智能方法

如何通过本身是类成员的指针调用成员函数

为什么 std::unique_ptr<>.release() 在赋值 lhs 中的成员函数访问之前被评估?

为什么 std::unique_ptr<>.release() 在赋值 lhs 中的成员函数访问之前得到评估?

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

如何迭代(在类外部)作为矢量<unique_ptr <T >>的私有成员

std :: unique_ptr结构成员为结构类型

出现unique_ptr问题:不是“ std”的成员

如何将非静态成员函数作为unique_ptr删除器传递

如何通过共享的PTR访问类的成员函数?

如何通过函数指针递归调用类成员函数?

C ++ std :: shared_ptr会初始化类中的其他成员数据

如何构造具有unique_ptr成员的对象?

如何移动包含 unique_ptr 作为成员的对象向量?

如何构造一个具有“unique_ptr”作为成员变量的对象的“std::vector”?

如何从类映射中调用成员函数

如何调用与类成员同名的函数

如何从成员类中调用函数?

如何调用类成员的构造函数?

Javascript类成员函数通过setInterval调用成员函数,无法访问成员变量

如果您的类是从unique_ptr派生的,那么如何调用基本构造函数

如何通过成员变量调用函数?

通过模板中的成员函数指针对shared_ptr进行成员函数调用

如何为其他类成员函数编写模板包装器方法?