我正在尝试一组自定义容器函数,并从Scala的集合库中获取有关CanBuildFrom[-From, -Elem, -To]隐式参数的灵感.
在Scala的集合中,CanBuildFrom支持返回类型函数的参数化map.在内部,CanBuildFrom参数像工厂一样使用:map在它的输入元素上应用它的第一个顺序函数,将每个应用程序的结果提供给CanBuildFrom参数,最后调用CanBuildFrom的result方法来构建调用的最终结果map.
在我的理解中,-From类型参数CanBuildFrom[-From, -Elem, -To]仅用于apply(from: From): Builder[Elem, To]创建Builder具有一些元素的预初始化.在我的自定义容器函数中,我没有那个用例,所以我创建了自己的CanBuildFrom变体Factory[-Elem, +Target].
现在我可以有一个特质 Mappable
trait Factory[-Elem, +Target] {
def apply(elems: Traversable[Elem]): Target
def apply(elem: Elem): Target = apply(Traversable(elem))
}
trait Mappable[A, Repr] {
def traversable: Traversable[A]
def map[B, That](f: A => B)(implicit factory: Factory[B, That]): That =
factory(traversable.map(f))
}
Run Code Online (Sandbox Code Playgroud)
和实施 Container
object Container …Run Code Online (Sandbox Code Playgroud) 我需要一个自定义随机访问集合类的迭代器.我想使用迭代器std::sort.因为我是一个时间预算有限的C++新手,所以我想避免自己写整篇文章.
我的迭代器基本上只是一个简单的size_t.因此,我认为boost::counting_iterator可能是一个很好的匹配.一旦我完成了,Incrementable我必须意识到counting_iterator它将其引用类型定义为const Incrementable&.
虽然我仍然对很多C++感到困惑,但我相信这会阻止我使用迭代器,std::sort因为const迭代器不能用于交换集合元素.
这是一个问题:为什么要将boost::counting_iterator其引用类型定义为,const并且可能更重要的是,我应该使用什么呢?