gpt4 book ai didi

c++ - 如何编写一个以 boost::Range 作为参数的函数?

转载 作者:可可西里 更新时间:2023-11-01 18:27:32 26 4
gpt4 key购买 nike

这是实现我自己接受 boost range 的函数(例如 DoSomethingWithRange)的好方法吗?作为参数?

#include <iostream>
#include <vector>
#include <boost/range.hpp>
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>

using namespace std;

template <typename RangeType>
void DoSomethingWithRange(const RangeType &range)
{
typename RangeType::const_iterator beginIt = boost::begin(range);
typename RangeType::const_iterator endIt = boost::end(range);

for(typename RangeType::const_iterator it = beginIt; it != endIt; ++it)
{
cout << *it << endl;
}
}

bool IsPos(int i)
{
return i>0;
}

int main(int , char** )
{
vector<int> test;

test.push_back(1);
test.push_back(-1);

DoSomethingWithRange(test | boost::adaptors::filtered(IsPos));
}

最佳答案

这不适用于普通数组,因为 RangeType::const_iterator不会被定义。传入 std::pair<iterator,iterator> 时也不起作用,Boost.Range 也支持它。

相反,您应该使用 boost::range_iterator<const RangeType>::type .这将适用于 Boost.Range 支持的所有类型:普通可迭代对象、数组和迭代器对。

例子:

template <typename RangeType>
void DoSomethingWithRange(const RangeType &range)
{
typedef typename boost::range_iterator<const RangeType>::type const_iterator;
const_iterator endIt = boost::end(range);
for(const_iterator it = boost::begin(range); it != endIt; ++it)
cout << *it << endl;
}

int main(int, char** )
{
vector<int> test;
test.push_back(1);
test.push_back(-1);
DoSomethingWithRange(test);

int test2[] = {12,34};
DoSomethingWithRange(test2);

std::pair<int*,int*> test3(test2, test2+1);
DoSomethingWithRange(test3);
}

关于c++ - 如何编写一个以 boost::Range 作为参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501571/

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