最近我开始研究基于图形的数据库系统的实现。但是我遇到了一个小问题。
允许图表中的顶点包含任何类型的可比类型的属性。我正在考虑为这些创建一个地图,因为密钥总是基于字符串。但是我不想被实际类型所困扰,我唯一想做的就是比较它们并仍然保持安全检查。我该怎么做呢?
当我第一次接近时,我正在考虑使用boost,但它仍然让我头疼做一些手动类型检查,我绝对不想这样做。
在Java中我会做这样的事情,但是我并没有在C ++中使用这些东西。
map<String, ? extends comparable>
这样做的原因是属性可以是任何类似的类型。
答案 0 :(得分:0)
不是实际的答案,而是一个请求的例子:
我习惯于创建这样的模板:
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类似于某些类型)原因)。
因此,只有那里专门的人才会工作(因为否则会缺少实现),你可能已经涵盖了大部分内容,并且在极少数情况下有人需要另一个专业化,他只需将其添加到列表中。
最后,执行操作与可能不需要的操作一样严格,因为如果执行某些禁止操作,它将无法编译,例如在没有为该类型定义时使用&lt; -operator,但是如果你想要那种严格的控制,你可以这样做。当然这还没有得到动态控制?延伸......,但它至少有控制权。另一个优点是你可以像往常一样在CPP文件中实现代码,而不必像动态模板那样将所有内容都放在标题中,这主要是为什么它是我的标准。
您当然可以直接在CPP底部直接编写专业化文件的内容,而不是包含另一个标题,但我认为专业化标题更优雅,通知潜在用户允许的内容并为他们提供选项添加到它而不看实现。