gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:37:21 25 4
gpt4 key购买 nike

使用 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);
}

但是使用模板参数可以实现相同的功能并 boost 效率,这满足了 ForwardRange 概念:

template <class ForwardRange>
void display_integers(const ForwardRange& rng)
{
boost::copy(rng,
std::ostream_iterator<int>(std::cout, ","));

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_integers 将只编译一次,但在第二种情况下,它将针对传递范围的每种类型进行编译。

另外,你可能在某个地方

integer_range rng;

并且在 rng 的生命周期内,您可以分配 different types to it 的范围:

vector<int> v;
list<int> l;
integer_range rng;
rng = v;
rng = l;

类型删除的最大缺点是它的运行时成本;所有操作都是虚拟的,不能(轻易)内联。


附言类型删除的另一个著名示例是 std::function

关于c++ - 使用 boost::any_range 有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com