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