Вы можете написать свой собственный dynamic_cast_iterator
, используя boost::transform_iterator
. Он должен применяться к исходным итераторам при вызове transform
, но не к целевому итератору.
#include <algorithm>
#include <vector>
#include <boost/iterator/transform_iterator.hpp>
//First define a unary functor object that dynamic_casts.
//(This is easier than using boost::lambda, because writing the type of
//boost::lambda::ll_dynamic_cast is fairly tricky.)
template <typename Target>
struct dynamic_caster
{
typedef Target result_type;
template <typename Source>
Target operator()(Source s) const
{
return dynamic_cast<Target>(s);
}
};
template <typename Target, typename Iterator>
boost::transform_iterator<dynamic_caster<Target>, Iterator>
make_dynamic_cast_iterator(Iterator it)
{
return boost::make_transform_iterator(it, dynamic_caster<Target>());
}
//Then use like this:
int main()
{
std::vector<T*> v;
//(Populate v)
std::vector<S*> w;
std::transform(make_dynamic_cast_iterator<S *>(v.begin()),
make_dynamic_cast_iterator<S *>(v.end()),
w.begin());
//Or initialise a vector from v
std::vector<S*> x(
make_dynamic_cast_iterator<S *>(v.begin()),
make_dynamic_cast_iterator<S *>(v.end()));
}