微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/c/113066.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐