如何编写一个以boost::Range为参数的函数
How to write a function that has a boost::Range as parameter?
这是实现我自己的函数(例如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
。当传入Boost.Range也支持的std::pair<iterator,iterator>
时,它也不起作用。
相反,您应该使用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);
}
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类