c++ - 如何隐式调用包含在 std::map 集合中的 shared_ptr 中的值的构造函数
问题描述
我正在使用代码生成器,我无法直接获取包装shared_ptr
并放置在std::map
.
我遇到了需要创建新地图对象但无法访问类名的情况,我无法执行有效的对象构造函数调用。我尝试使用映射运算符 at[],它调用值构造函数,但它调用shared_ptr<T>
构造函数并且内部的对象保持未初始化状态。
这里的例子:
#include <iostream>
#include <map>
#include <memory>
class A
{
public:
A() { std::cout << "A"; }
int getMember() const { return m_member; }
private:
int m_member = 1;
};
int main()
{
std::map<int, A> mapIntToA;
std::map<int, std::shared_ptr<A>> mapIntToAptr;
mapIntToA[1]; // runs A constructor
std::cout << mapIntToA[1].getMember();
mapIntToAptr[1]; // runs shared_ptr constructor
// cant call methods of uninitalized object
// std::cout << mapIntToAptr[1]->getMember();
// this init works, but I can't use classname 'A' in my code generator
// mapIntToAptr[1] = std::make_shared<A>();
return 0;
}
解决方案
std::map
您可以使用和的成员类型std::shared_ptr
来获取元素的类型。
就像是
using type = typename std::map<int, std::shared_ptr<A>>::mapped_type::element_type;
mapIntToAptr[1] = std::make_shared<type>();
推荐阅读
- nativescript - 图像资产和位图工厂插件之间的主要区别是什么
- c++ - 为什么我的 if 子句不起作用?如何修复变量类型?
- python - 如何在至少调用一次函数之前禁用键盘上的某个键?
- bash - 如何通过管道查找路径的基本名称
- javascript - 如何创建验证超集以扩展基本功能
- command-line - 是否可以通过 Linux 命令行发送 SMS 消息?
- sfx - 是否可以链接启动目录(SFX 的)以在提取到临时文件夹的脚本中使用?
- django - 如何在不同服务器上使用redis进行缓存
- c++ - 为什么成员函数调用“模棱两可”?
- neo4j - 奇怪的输入数据,整个缓冲区没有换行符 4194304,不支持atm