最近我开始致力于实现基于图形的数据库系统。但是我遇到了一个小问题。
允许图中的顶点包含任何类型的可比较类型的属性。我正在考虑为这些创建一个映射,因为键总是基于字符串的。但是我根本不想被实际类型打扰,我唯一想做的就是比较它们并仍然保持安全检查。我该怎么做?
当我第一次尝试时,我正在考虑使用 boost,但是它仍然会让我头疼地进行一些手动类型检查,我绝对不想这样做。
在 Java 中我会做这样的事情,但是在 C++ 中我不习惯这些事情。
map<String, ? extends comparable>
原因是属性可以是任何可比较的类型。
最佳答案
不是实际答案,而是请求的示例:
我习惯于创建这样的模板:
一些类.h:
#guards etc
template<class T> //or whatever you need
class SomeClass {
public:
SomeClass();
T content();
private:
T m_content;
}
一些类.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 like types for some原因)。
因此,只有那些在此处专门化的才能工作(否则缺少实现),您可能已经涵盖了其中的大部分,并且在极少数情况下,有人需要其他特化,他只需将其添加到列表中即可。
最后,这样做可能不需要那么严格,因为如果执行了一些禁止的操作,它无论如何都不会编译,比如在没有为该类型定义时使用 <-operator,但是如果你想那个严格的控制,你可以那样做。当然这还没有动态控制? extends ...,但它至少有控制权。另一个优点是您可以像往常一样在 CPP 文件中实现代码,而不必按照动态模板的要求将所有内容都放在 header 中,这就是它成为我的标准的主要原因。
您当然可以直接在 CPP 的底部直接写入特化文件的内容,而不是包含另一个标题,但我认为特化标题更优雅,告知潜在用户允许的内容并为他们提供选项在不查看实现的情况下添加它。
关于c++ - 具有可比键类型的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504471/