我有一个模板化的课程Foo
,可以进行身份比较(通过==
),但有一个函数Foo::sameStructureAs(Foo const & other)
可用于更多的"值" vs."指针"平等的概念。
我想制作一个覆盖哈希函数和等式谓词的unordered_map
。它们默认为std::equal_to<Key>
和std::hash<Key>
...我根据身份为我的类型提供。但我需要他们根据我的sameStructureAs
进行比较。
由于Foo是一个模板,我会这样做:
template <class> struct same_structure_as;
template <class> struct hash_structure;
template <class T>
struct hash_structure<Foo<T>>
{
size_t operator() (Foo<T> const & value) const
{
// whatever...
}
};
template <class T>
struct same_structure_as<Foo<T>>
{
bool operator() (Foo<T> const & left, Foo<T> const & right) const
{
// whatever...
}
};
为了这个目的,我似乎大致遵循了std::
中的类的策略,并创建了一些通用的东西。那看起来是对的吗?
其次:在std ::中已经存在的这个或原型的命名有先例吗?我考虑过像isomorphic
或congruent
这样的字词。当你有多个关于它意味着什么的概念时,它似乎经常会出现在设计课程中。#/ p;
答案 0 :(得分:0)
如果您通过这种“不同”的比较或平等概念来查看某种类型,请询问您真正需要的是另一种类型。也许你会对基础数据采用某种强制转换或强制措施,这样它的新概念/赋值/比较就适合你正在设计的这个测试。
通过这种方式,您可以正确实现该类型的std :: functions ...并在集合中使用它,而无需传递这些额外的谓词。因此,可能使用指针等式语义FooRef
调用类型,并使用值语义Foo
调用该类型。
如果出于某种原因你不能这样做......那么看一下你想要并行的名字:
std::equal_to<Key>
std::hash<Key>
保持equal_to
和hash
可能与“标准”最接近。因此,不要引入像congruence
或isometric
这样的新术语,而是要确切地说出相等或散列的内容......并使用上面的后缀作为后缀:
std::content_equal_to<Key>
std::content_hash<Key>
如果是比较某些内容的“结构”,您可以将其应用于structure_equal_to
和structure_hash
。唯一需要注意的是“结构”/“结构”在C ++中具有意义,因此它可能会引导读者认为它正在比较type_info或类似的内容。