c++ - C++ 中的类型转换迭代器

标签 c++ boost stl iterator

我有 SDK::TIPAddressDescription 类型,我无法控制它,而我的 THNNetIface 也没有得到足够的控制,因为它是从 IDL< 生成的规范。我还用迭代器包装了类型,使它们可以与 STL 一起使用。

我想对现有代码进行修改:

// Update IP addresses of interfaces existing in DB
vector<THNNetIface> modIfaces;
set_intersection(ifaceFirstIter, ifaceLastIter, ipFirstIter, ipLastIter, 
    back_inserter(modIfaces), HNInfoComparator());

具有以下内容:

// Note: delIfaces is not of type SDK::TIPAddressDescription as expected by STL;
vector<THNNetIface> delIfaces;
set_difference(ipFirstIter, ipLastIter, ifaceFirstIter, ifaceLastIter,
    mod_inserter(delIfaces), HNInfoComparator());

其中 mod_iterator 充当从 SDK::TIPAddressDescription 类型到每个元素的 THNNetIface 的转换器(以满足 STL 要求)和 back_inserter 同时(或与它们兼容)。

如何做这个类型转换迭代器?在类似 Boost 的库中是否存在这样做的现有方法?

最佳答案

是的,Boost Iterator 和 Boost Range 具有执行此操作的功能。

  • 最通用的是 boost::function_output_iterator

    Live On Coliru (c++03)

    auto output = boost::make_function_output_iterator(
            phx::push_back(phx::ref(delIfaces), phx::construct<THNNetIface>(arg1)));
    
    boost::set_difference(iface, ip, output, HNInfoComparator());
    

    Live On Coliru (c++11)

    auto output = boost::make_function_output_iterator(
            [&](TIPAddressDescription const& ip) { delIfaces.emplace_back(ip); });
    
    boost::set_difference(iface, ip, output, HNInfoComparator());
    

  • boost 范围 transformed也许与 boost::phoenix::construct<>可能更优雅 遗憾的是这个选项不可用,因为set_difference需要一个输出迭代器。这是一个 想

关于c++ - C++ 中的类型转换迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28114181/

相关文章:

java - 映射类型 : char**& in JNA

c++ - boost 单元测试和捕获异常

c++ - 如果对象调整其容器的大小会怎样?

c++ - 为什么 vector::operator[] 的实现方式与 map::operator[] 不同?

c++ - 如何解决循环嵌套类定义的问题

C++ : Binary Search Tree getHeight() access violation

c++ - openssl 以编程方式签名和加密有何不同

c++ - 实现一个简单的 RTSP 客户端/示例

ubuntu - 通过apt-get安装后如何告诉cmake找到boost?

c++ - 为我想存储在 <map> 中的类重载 "<"运算符