我搜索了std :: map运行时排序的实现,并找到了这个解决方案: STL std::map dynamic ordering
我很清楚,但我不明白,如何在std :: map的构造函数中使用OrderingType。 std :: map有一个构造函数,它将一个比较器对象作为参数。因此,从我的观点来看,使用这样的代码是正常的:
int main()
{
Ordering<int> test_ordering( ASCENDING );
CUSTOMMAP map1( test_ordering );
return 0;
}
但是上面提到的主题的代码也会编译:
int main()
{
CUSTOMMAP map1( ASCENDING );
//...
return 0;
}
我不明白,为什么它有效:std :: map的构造函数不能获取OrderingType枚举的参数而不是Ordering类对象本身。
答案 0 :(得分:9)
如果Ordering<int>
上带有枚举的构造函数未声明为explicit
,则它被视为“转换构造函数”,当编译器需要转换时,它可以自动插入您的枚举类型为Ordering<int>
类型。所以编译器实际上是这样做的:
CUSTOMMAP map1( ASCENDING );
并将其转化为:
CUSTOMMAP map1( Ordering<int>(ASCENDING) );
这称为隐式转化。