c++ - 多态(纯抽象)映射键牺牲类型安全?

标签 c++ polymorphism type-safety

一些上下文:(可以随意跳过)我有一个处理复杂数据的模块,但只需要知道它的一些语义。数据可以被认为是一个数据包:模块应该只推理不透明的有效负载字符串,但它最终会将整个事情传递给需要更多信息的人。然而,它必须......“捆绑”有关一些未知数据包信息的数据包,所以我想出了这个:

struct PacketInfo {
  virtual void operator==(PacketInfo const&) const = 0;
  virtual void operator<(PacketInfo const&) const = 0;
  virtual ~PacketInfo() {}
};

class Processor {
  private:
    template <typename T> struct pless {
      bool operator()(T const* a, T const* b) const {
        assert(a && b);
        return *a < *b;
      }
    };
    // this is where the party takes place:
    std::map<PacketInfo const*,X,pless<PacketInfo> > packets;
  public:
    void addPacket(PacketInfo const*,X const&);
};

现在的想法是,用户实现他的 PacketInfo 语义并将其传递到我的类。例如:
(回答前请仔细阅读问题末尾)

struct CustomInfo : public PacketInfo {
  uint32_t source;
  uint32_t dest;
  void operator==(PacketInfo const& b) const {
    return static_cast<CustomInfo const&>(b).dest == dest
    && static_cast<CustomInfo const&>(b).source == source;
  }
  // operator< analogous
};

当我使用static_cast时,大多数人会使用dynamic_cast,但rtti作为项目策略被停用。当然,我可以自制自己的类型信息,并且我之前已经这样做过,但这不是这里的问题。

问题是:如何在不牺牲类型安全(即根本不进行强制转换)的情况下获得我想要的东西(即拥有映射键而不知道其内容)?我非常希望将 Processor 类保留为非模板类​​型。

最佳答案

你不能。您要么在编译时知道类型,要么在运行时检查它们。没有 Elixir 。

关于c++ - 多态(纯抽象)映射键牺牲类型安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931595/

相关文章:

c++ - 直接在 MATLAB 中使用 tensorflow/keras?

c++ - 在迭代器的计算中,如果我使用 begin() 之前或 end() 之后的迭代器作为操作数,它的行为是否定义?

java - Mongodb 多态性 Java 对象无法确定具体类

python - 如何在 Matlab 中创建多态数组

c++ - sizeof(array)/sizeof(array[0])有什么问题吗?

scala - 为什么 asInstanceOf 不抛出 ClassCastException?

c++ - 图标不是 3.00 格式

c++ - 基于 ISO-639/ISO-3166 的语言/国家语言环境名称与 Windows 名称之间的转换表

c# - 要求基类的子级从基类调用方法的设计模式

c++ - 如何根据 OpenGL 规范安全地确保(在任何平台上)正确实现 char* 类型?