ソリューションで多くの範囲に参加SO boost::range::join for multiple ranges質問gnzlbg年代のセクションでは、それがboost::join
とboost::make_iterator_range
を呼び出すカスタム関数可変長引数テンプレートに1つのクライアントコードの呼び出しで多くの範囲に参加することができます意味します。その質問、答え、およびコメントによると、前の2つの範囲を結合することができますし、後者は、前のオーバーロードが使用されていることを確認する必要があります。const
2番目以降のコンテナはstd::forward
で完璧に転送されています。しかし、私のクライアントコードは、最大で3つの引数でしか呼び出すことができません。何もコンパイルに失敗します。何が間違っていて、どのように修正するのですか?そして今、多くの範囲に加わるBoostエンティティがありますか?ブースト::範囲:: 1つのカスタムコール
私はコピー&ペーストOPの実装という、空白のみ読みやすさのためにここでそれを編集して、関連するヘッダを追加しました:
#include <utility>
#include <boost/range/join.hpp>
template<class C>
auto join(C&& c)
-> decltype(boost::make_iterator_range(std::begin(c), std::end(c)))
{
return boost::make_iterator_range(std::begin(c), std::end(c));
}
template<class C, class D, class... Args>
auto join(C&& c, D&& d, Args&&... args)
-> decltype
(
boost::join
(
boost::join
(
boost::make_iterator_range(std::begin(c), std::end(c)),
boost::make_iterator_range(std::begin(d), std::end(d))
),
join(std::forward<Args>(args)...)
)
)
{
return boost::join
(
boost::join
(
boost::make_iterator_range(std::begin(c), std::end(c)),
boost::make_iterator_range(std::begin(d), std::end(d))
),
join(std::forward<Args>(args)...)
);
}
と私のクライアントのコードを追加しました:
#include <deque>
#include <array>
#include <vector>
#include <iostream>
int main()
{
std::deque<int> deq { 0, 1, 2, 3, 4 };
std::array<int, 4> stl_arr { 5, 6, 7, 8 };
int c_arr[3] { 9, 10, 11 };
std::vector<int> vec { 12, 13 };
for (auto& i : join(deq, stl_arr, c_arr))
{
++i;
std::cout << i << ", "; // OK, prints 1 thru 12
}
//join(deq, stl_arr, c_arr, vec); // COMPILER ERROR
}