【发布时间】:2017-02-28 09:11:07
【问题描述】:
最近我开始研究基于图形的数据库系统的实现。但是我遇到了一个小问题。
图中的顶点可以包含任何可比较类型的属性。我正在考虑为这些创建一个映射,因为键总是基于字符串的。但是我不想被实际类型打扰,我唯一想做的就是比较它们并仍然保持安全检查。我该怎么做呢?
当我第一次接触时,我正在考虑使用 boost,但是它仍然会让我感到头疼的是进行一些手动类型检查,我绝对不想这样做。
在 Java 中我会做这样的事情,但是我不习惯在 C++ 中使用这些东西。
map<String, ? extends comparable>
原因是属性实际上可以是任何可比较的类型。
【问题讨论】:
-
为什么要这样做?您的所有属性都派生自某个通用基类吗?你考虑过
boost::any吗?或者某种灵活的 JSON 对象而不是map? -
您只需在模板代码中比较它们即可。编译器会对模板的用户大喊大叫,因为他们会尝试使用错误的类型(不可比较)。但是,错误消息将难以阅读。如果你想要更易读的消息,你需要 C++11 和 static_assert。
-
(续)要查看此类错误消息的示例,请尝试使用
struct foo{}; std::map<foo, int> a。演示ideone.com/PXL0x2 -
当然可以做的事情:像往常一样在 cpp 文件中实现它们,并在末尾包含一个专业化标头。这将需要需要新类型顶点的人来更改专业化文件,然后您只需在其中放入允许的详细 cmets。即使有一些广泛的可比对象,实际使用的专业化的数量也不会那么那么大,也不应该一直需要更改。
-
我想这样做是因为我的顶点可以具有广泛的可能属性。 (即出生日期:日期,年龄:int,姓名:字符串,lastlogin:dattime,..)我的大多数查询只会检查是否相等,而有些查询会检查不等式。这些比较的结果应该是真/假,这实际上就是关于这些属性的全部内容。是的,我已经尝试过提升,但这并不是我想要的。 @Aziuth您能否提供更多详细的示例?提前致谢。