C++ 接受对抽象类的常量引用的构造函数无法初始化 std::map

C++ Constructor that accepts const reference to abstract class can't initialize std::map

本文关键字:std map 构造函数 初始化 引用 抽象类 常量 C++      更新时间:2023-10-16

我有一个抽象类A,它正在为它在B类中的实现定义一个接口。A 的所有方法都是纯虚拟的。

我的问题是带有签名 B(const A 和base(的 B 的构造函数。我被卡住了。。。我无法弄清楚正确复制标准::地图的内容。有关更多详细信息,请参阅下文。任何帮助将不胜感激!

struct W {
    W() = default;
};
template<typename T>
struct V : public W {
    V() = default;
};
class A {
public:
    A() = default;
    virtual std::map<std::shared_ptr<const W>, std::any> getFields() const = 0;
};
template<typename T>
class B : public A {
private:
    std::map<std::shared_ptr<const V<T>>, std::any> _fields;
    T _value;
public:
    B(T value) : _value(value) {
    }
    explicit B(const A &base) {
        for (std::pair<std::shared_ptr<const W>, std::any> field : base.getFields()) {
            auto key = std::dynamic_pointer_cast<const V<T>>(field.first);
            // the line below does not compile...
            _fields.insert(key, field.second);
        }  
    }
    std::map<std::shared_ptr<const W>, std::any> getFields() const override {
        std::map<std::shared_ptr<const W>, std::any> copy;
        copy.insert(_fields.begin(), _fields.end());
        return copy;
    }
};
struct C {
  std::vector<std::shared_ptr<const B<int>>> vec;
  void addElement(const A& element) {
      vec.push_back(std::make_shared<const B<int>>(element));
  }  
};

std::map::insert(( 采用键值对,而不是单独的键和值:

_fields.insert(std::make_pair(key, field.second));

或者,考虑 std::map::emplace((,它在 map 中就地构造键值对:

_fields.emplace(std::move(key), std::move(field.second));