在 C++ 11 中返回 const std::map<std::string, const std::shared_ptr<Object const>>

问题描述 投票:0回答:1

我有一张如下所示的地图:

std::map<std::string, std::shared_ptr<Object>>

我需要在类中创建一个方法,以确保地图及其内容是只读的。

有没有一种方法可以定义一个返回类似以下内容的方法:

const std::map<std::string, const std::shared_ptr<Object const>>
而不修改地图的原始定义或创建它的副本?

我需要返回的地图是恒定的,

std::shared_ptr
是恒定的,底层的
Object
是恒定的

我不确定如何以返回具有 const 值的 const 映射的方式定义该方法。

c++ c++11
1个回答
0
投票

由于

shared_ptr<Object>
shared_ptr<Object const>
是两种不同的类型,这个想法听起来不太安全。这是一个可能出错的例子:

template <typename T>
struct Foo
{
};


template <>
struct Foo<int>
{
    int i;

    Foo():
        i{12}
    {}

    void print() const
    {
        std::cout << i << std::endl;
    }

};


template <>
struct Foo<int const>
{
    void print() const
    {
        std::cout << "Ooops!" << std::endl;
    }
};


struct Bar
{
    std::map<std::string, Foo<int>> map;

    std::map<std::string, Foo<int>> & get()
    {
        return map;
    }

    std::map<std::string, Foo<int const>> const & const_get()
    {
        return *reinterpret_cast<std::map<std::string, Foo<int const>> *>(&map);
    }

    Bar()
    {
        map["a"];
    }
};


int main()
{
    Bar b;
    {
        auto & foo = b.get().at("a");
        std::cout << b.get().at("a").i << std::endl; // 12
        foo.print(); // 12
    }
    {
        auto & foo = b.const_get().at("a");
        // std::cout << b.const_get().at("a").i << std::endl; // Compilation error
        foo.print(); // Ooops!
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.