C++ 中的类型转换迭代器
Type conversion iterator in C++
我有我无法控制的类型 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 Range transformed
也许 boost::phoenix::construct<>
可能更优雅 遗憾的是这个选项不可用,因为 set_difference
需要一个输出迭代器.这是一个
thinko
我有我无法控制的类型 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 Range遗憾的是这个选项不可用,因为transformed
也许boost::phoenix::construct<>
可能更优雅set_difference
需要一个输出迭代器.这是一个 thinko