如何在指针向量之间动态转换?

发布于 2024-07-19 10:44:17 字数 229 浏览 4 评论 0原文

我有:

class T {};

class S: public T {};

vector<T*> v;
vector<S*> w;

transform(v.begin(), v.end(), dynamic_cast_iterator<S*>(w.begin()));

但是,当然,dynamic_cast_iterator 不存在。

I have:

class T {};

class S: public T {};

vector<T*> v;
vector<S*> w;

transform(v.begin(), v.end(), dynamic_cast_iterator<S*>(w.begin()));

But, of course, dynamic_cast_iterator doesn't exist.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦开始←不甜 2024-07-26 10:44:17

这是一种解决方案(使用 boost lambda):

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/casts.hpp>
#include <algorithm>
#include <iterator>
#include <iostream>

namespace bll = boost::lambda;

struct A { virtual ~A() { } };
struct B : A { void f() { std::cout << "hello, world" << std::endl; } };

int main() {
    std::vector<A*> a; a.push_back(new B);
    std::vector<B*> b;
    std::transform(a.begin(), a.end(), std::back_inserter(b), 
                   bll::ll_dynamic_cast<B*>(bll::_1));
    b[0]->f();
    delete a[0];
}

Here is one solution (using boost lambda):

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/casts.hpp>
#include <algorithm>
#include <iterator>
#include <iostream>

namespace bll = boost::lambda;

struct A { virtual ~A() { } };
struct B : A { void f() { std::cout << "hello, world" << std::endl; } };

int main() {
    std::vector<A*> a; a.push_back(new B);
    std::vector<B*> b;
    std::transform(a.begin(), a.end(), std::back_inserter(b), 
                   bll::ll_dynamic_cast<B*>(bll::_1));
    b[0]->f();
    delete a[0];
}
孤云独去闲 2024-07-26 10:44:17

您可以使用 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()));

}

You could write you own dynamic_cast_iterator using boost::transform_iterator. It has to be applied to the source iterators in a call to transform, though, not the target iterator.

#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()));

}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文