c – 使用boost :: any_range有什么好处?

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

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...