有没有办法挂钩 std 容器的插入和删除操作?

Ser*_*sak 3 c++ containers std

比方说,我们要对 进行子类化std::map,并且需要捕获容器中的所有插入和删除操作。例如,为了保存有关容器中存在的密钥的一些特定于应用程序的信息。

如果可能的话,最简单的方法是什么?

也许,最明显的方法是重写执行插入和删除的所有方法和运算符。但我想,这样一来,很容易就会忽略一些东西,不是吗?

Ayx*_*xan 5

一般情况下没有办法做到这一点。继承不是一个好主意,因为std::map它不是多态的,并且当您使用指向映射的指针时不会发生虚拟调度。此时您不妨使用一个简单的包装类,这样可以省去很多麻烦:

#include <iostream>
#include <map>

template <class Key, class Value> 
struct Map {
private:
  std::map<Key, Value> _data;

public:
  template <class Y, class T> 
  void insert(Y &&key, T &&val) {

    std::cout << "[" << key << "] = " << val << "\n";

    _data.insert_or_assign(std::forward<Y>(key), std::forward<T>(val));
  }

  void remove(Key const &key) {
    auto const it = _data.find(key);

    if (it == _data.end())
      return;

    std::cout << "[" << key << "] -> removed\n";

    _data.erase(it);
  }

  Value *get(Key const &key) {
    auto const it = _data.find(key);

    if (it == _data.end())
      return nullptr;

    return &it->second;
  }
};

int main() {
  Map<int, char const *> map;
  map.insert(10, "hello");
  map.insert(1, "world");
  map.remove(1);
  map.remove(10);
  map.remove(999);
}
Run Code Online (Sandbox Code Playgroud)