加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读