【问题标题】:how do I dynamically cast between vectors of pointers?如何在指针向量之间动态转换?
【发布时间】:2023-03-21 10:55:01
【问题描述】:

我有:

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 不存在。

【问题讨论】:

  • 您正在寻找协变或逆变之一(我忘记了)。

标签: c++ stl boost


【解决方案1】:

这是一种解决方案(使用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];
}

【讨论】:

    【解决方案2】:

    您可以使用boost::transform_iterator 编写您自己的dynamic_cast_iterator。它必须在对transform 的调用中应用于源迭代器,而不是目标迭代器。

    #include #include #include //首先定义一个dynamic_casts的一元函子对象。 //(这比使用 boost::lambda 更容易,因为写的类型 //boost::lambda::ll_dynamic_cast 相当棘手。) 模板 结构体动态施法者 { typedef 目标结果类型; 模板 目标 operator()(Source s) const { 返回 dynamic_cast(s); } }; 模板 boost::transform_iterator, Iterator> make_dynamic_cast_iterator(迭代器) { 返回 boost::make_transform_iterator(it, dynamic_caster()); } //然后像这样使用: 主函数() { 标准::向量 v; //(填充 v) 标准::向量 w; std::transform(make_dynamic_cast_iterator(v.begin()), make_dynamic_cast_iterator(v.end()), w.开始()); //或者从v初始化一个向量 标准::向量 x( make_dynamic_cast_iterator(v.begin()), make_dynamic_cast_iterator(v.end())); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 2023-03-08
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多