在C ++中键入转换迭代器

时间:2015-01-23 16:20:04

标签: 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类似的库中是否存在这样做的方法?

1 个答案:

答案 0 :(得分:1)

是的,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需要输出迭代器。这是一个 thinko