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

前端之家收集整理的这篇文章主要介绍了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&C++相关文章