使用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