我一直在努力理解boost范围适配器的使用,但我发现的所有工作示例都只使用具有基本类型(如std::list<int>
)的STL容器,而试图使用我自己的类会让一切都崩溃。
#define BOOST_RESULT_OF_USE_DECLTYPE
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <boost/range/adaptors.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/algorithm.hpp>
struct Thing
{
Thing() : _id(0), _name(""){}
std::size_t _id;
std::string _name;
};
int main()
{
std::vector<Thing> input;
std::vector<Thing> output;
std::function<Thing (Thing&)> transform( [](Thing& t)->Thing{
t._name = "changed";
return t;});
struct Filter
{
typedef bool result_type;
typedef const Thing& argument_type;
result_type operator()(const Thing& t)
{
return t._id > 1;
}
};
Filter filter;
boost::copy(input
| boost::adaptors::filtered(filter)
| boost::adaptors::transformed(transform)
| boost::adaptors::reversed,
output
);
}
使用gcc 4.6/4.8和boost 1.48/1.54/trunk,我得到以下编译错误:
/usr/include/c++/4.8/bits/stl_algobase.h:382:57: error: no type named ‘value_type’ in ‘struct std::iterator_traits<std::vector<Thing> >’
typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
^
/usr/include/c++/4.8/bits/stl_algobase.h:387:9: error: no type named ‘value_type’ in ‘struct std::iterator_traits<std::vector<Thing> >’
&& __are_same<_ValueTypeI, _ValueTypeO>::__value);
我理解decltype
和result_of
的问题,这可能会导致transformed
的问题,尽管我的BOOST_RESULT_OF_USE_DECLTYPE
根据答案进行了定义。然而,我不明白为什么我不能将函子结构传递给filtered
,或者我的Thing
类是否有其他要求。
根据文档,copy
的第一个参数是一个范围,第二个参数是迭代器,因此将调用更改为:
boost::copy(input
| boost::adaptors::filtered(filter)
| boost::adaptors::transformed(transform)
| boost::adaptors::reversed,
std::back_inserter(output)
);
使其与g++4.8.1和boost 1.53.0一起编译良好。