簡體   English   中英

C ++函數輸出迭代器適配器

[英]C++ functor to output iterator adapter

給定一個適合與std::for_each和朋友一起使用的std::for_each函數:

template <typename T> struct Foo {
    void operator()(T const& t) { ... }
};

std::for_each(v.begin(), v.end(), Foo<Bar>());

有沒有一些標准的方法將其轉換為適合與std::copy和朋友一起使用的輸出迭代器? (或相反的改編)類似於:

std::copy(v.begin(), v.end(), functor_output_iterator(Foo<Bar>()));

每次將值賦給迭代器時,都會調用仿函數:

adapter(F f) : functor(f) { }
adapter& operator*()  { return *this; }
operator=(T const& t) { functor(t); }
operator++()          { }
...

或者,或者:

std::for_each(..., some_adapter(std::ostream_iterator(std::cout)));

背景:

我有一個使用輸出迭代器公開集合的類:

template <typename It> GetItems(It out) {
    MutexGuard guard(mutex);
    std::copy(items.begin(), items.end(), out);
}

這允許調用者訪問項目,而不必強制他們使用特定的容器類型,也不會弄亂鎖定或其他內部細節。

例如,只獲得獨特的物品:

std::set<whatever> set;
obj->GetItems(std::inserter(set, set.end()));

這打敗了:

ObjLock lock = obj->GetLock();
for (int i = 0; i < obj->GetItemCount(); ++i) {
    Item* item = obj->GetItem(i);
    ...

現在我也希望能夠聚合這些項目,而不是復制它們。 (見這個問題 )。 我通常會做的事情:

std::for_each(v.begin(), v.end(), Joiner<Foo>());

現在我可以為相同的數據元素創建兩個單獨的方法,一個調用std::copy ,另一個調用std::for_each但是能夠使用迭代器或仿函數定義一個這樣的方法會很好並讓調用者能夠將函子或迭代器傳遞給它,根據需要調整它們到適當的類型。

我現在正在做的是以這樣一種方式定義聚合器,它可以用作輸出迭代器或仿函數,但這會導致不必要的復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM