c – 使用boost :: any_range有什么好处?
发布时间:2020-12-16 06:01:15 所属栏目:百科 来源:网络整理
导读:使用boost :: any_range有什么好处? 这是一个例子: typedef boost::any_range int,boost::forward_traversal_tag,int,std::ptrdiff_t integer_range;void display_integers(const integer_range rng){ boost::copy(rng,std::ostream_iteratorint(std::cout
使用boost :: any_range有什么好处?
这是一个例子: typedef boost::any_range< int,boost::forward_traversal_tag,int,std::ptrdiff_t > integer_range; void display_integers(const integer_range& rng) { boost::copy(rng,std::ostream_iterator<int>(std::cout,",")); std::cout << std::endl; } int main(){ std::vector<int> input{ ... }; std::list<int> input2{ ... }; display_integers(input); display_integers(input2); } 但是,使用模板参数可以实现具有更高效率的相同功能,该参数满足ForwardRange概念: template <class ForwardRange> void display_integers(const ForwardRange& rng) { boost::copy(rng,")); std::cout << std::endl; } 所以我正在寻找一些值得使用any_range的场景.也许我错过了一些东西. 解决方法
这种技术称为类型擦除.有关于any_iterator的优缺点的全文:
On the Tension Between Object-Oriented and Generic Programming in C++.
有可能隐藏实施/定义 void display_integers(const integer_range& rng) 在单独的文件/库中. 但是在这种情况下 template <class ForwardRange> void display_integers(const ForwardRange& rng) 您必须向用户提供源代码(或至少在某个地方生成explicit instantiations). 此外,在第一种情况下,display_integer将仅被编译一次,但在第二种情况下,将为每种类型的传递范围编译它. 另外,你可能有 integer_range rng; 某处.在rng的生命周期中,您可以指定范围为different types to it: vector<int> v; list<int> l; integer_range rng; rng = v; rng = l; 类型擦除的最大缺点是运行时成本 – 所有操作都是虚拟的,不能内联(容易). 附:类型擦除的另一个着名的例子是std::function (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |