首页 > 解决方案 > 如何隐式调用包含在 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;
}

标签: c++c++14shared-ptr

解决方案


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>();

推荐阅读