2017-01-03 12 views
2

整数の範囲で動作する特定のアルゴリズムがあるとします。この関数は、この範囲で2つのイテレータを取り、その作業を行います。イテレータを特定のフィールドのイテレータにマップする(ブーストを使用できる)

template <typename It> 
void doWork(It begin, It end) { 
    int x = *begin; // range is over integers 
    // ... 
} 

、私は2つのデータ構造を持っていると仮定します

struct S { int x; } 

using TupleList = std::vector<std::tuple<int, double>>; 
using SList = std::vector<S>; 

私は(別途)TupleListSListの両方でアルゴリズムを使用したいと思います。しかし、直接イテレータは、TupleListSListは整数を直接的には含んでいないので動作しません。

template <typename It, typename Unwrap> 
void doWork(It begin, It end, Unwrap unwrap) { 
    int x = unwrap(*begin); 
    // And so on 
} 
// ----- 
auto Sunwrapper = [](const S& s) { return s.x; } 
doWork(begin(Slist), end(Slist), Sunwrapper); 

しかし、私はきちんと機能を維持することを好むだろう:

一つの解決策は、さらにイテレータをアンラップするためのアルゴリズムにファンクタを渡すことであろう。そのようなアンラッパ関数からイテレータを自動的に作成する方法はありますか?

auto unwrappedBegin = some_magical_factory(begin(Slist), Sunwrapper); 
auto unwrappedEnd = some_magical_factory(end (Slist), Sunwrapper); 

doWork(unwrappedBegin, unwrappedEnd); 

答えて

2

boost::transform_iteratorがこれに適しているようです。 some_magical_factoryboost::make_transform_iteratorに置き換えて、適切なヘッダーを含めればうまくいくはずです。

関連する問題