【问题标题】:Map with comparable key types具有可比较键类型的映射
【发布时间】: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&lt;foo, int&gt; a。演示ideone.com/PXL0x2
  • 当然可以做的事情:像往常一样在 cpp 文件中实现它们,并在末尾包含一个专业化标头。这将需要需要新类型顶点的人来更改专业化文件,然后您只需在其中放入允许的详细 cmets。即使有一些广泛的可比对象,实际使用的专业化的数量也不会那么那么大,也不应该一直需要更改。
  • 我想这样做是因为我的顶点可以具有广泛的可能属性。 (即出生日期:日期,年龄:int,姓名:字符串,lastlogin:dattime,..)我的大多数查询只会检查是否相等,而有些查询会检查不等式。这些比较的结果应该是真/假,这实际上就是关于这些属性的全部内容。是的,我已经尝试过提升,但这并不是我想要的。 @Aziuth您能否提供更多详细的示例?提前致谢。

标签: c++ graph typing


【解决方案1】:

不是实际答案,而是请求的示例:

我习惯于创建这样的模板:

SomeClass.h:

#guards etc

template<class T> //or whatever you need
class SomeClass {

    public:
    SomeClass();
    T content();

    private:
    T m_content;
}

SomeClass.cpp:

#include "SomeClass.h"

template<class T>
SomeClass::SomeClass(){
    m_content = (T) 0;
}

template<class T>
T SomeClass::content(){
    return T;
}

#include "SomeClass_Specializations.h"

SomeClass_Specializations.h:

#guards etc

#include "SomeClass.h"

#include "MyMagicUint.h"

//only types that behave like unsigned int may be added!
template class SomeClass<unsigned short>;
template class SomeClass<unsigned int>;
template class SomeClass<unsigned long>;
template class SomeClass<MyMagicUint>;

如果您这样做,您可以专门列出一些常见的可比较类型的长列表,并写一个评论,在其中描述允许其他人添加到该列表中的内容(在我的示例中,一些类似 unsigned int 的类型原因)。

因此,只有那些在此处专门化的才能起作用(因为否则会缺少实现),您可能已经涵盖了其中的大部分,并且在极少数情况下,有人需要另一个专门化,他只需将其添加到列表中。

最后,doing 严格到可能不需要的程度,因为如果执行了一些禁止的操作,它无论如何都不会编译,比如在没有为该类型定义的情况下使用

您当然可以直接将专业化文件的内容直接写在 CPP 的底部,而不是包含另一个标题,但我认为专业化标题更优雅,可以告知潜在用户允许的内容并为他们提供选项在不查看实现的情况下添加它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-06
    • 2023-03-28
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多