我有一张如下所示的地图:
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 映射的方式定义该方法。
由于
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;
}