Предполагая, что я правильно понимаю проблему, следующий шаблон функции хорошо работает для этой цели в C ++ 17 и более поздних версиях.
Эта функция создает target.push_back(elem)
тогда и только тогда, когда A
совпадает с B
.
Иначе, это идет к следующей глубине:
Live DEMO
template<
class A,
class B,
template <class...> class Container,
class... extras>
void flat_transfer(std::vector<A>& target, const Container<B, extras...>& source)
{
for(const auto& elem : source)
{
if constexpr(std::is_same<A, B>::value){
target.push_back(elem);
}
else{
flat_transfer(target, elem);
}
}
}
Это пример использования:
std::vector<int> v{1,2,3};
std::set<std::vector<std::deque<int>>, std::greater<>> vv{{{4,5}, {6,7}, {8,9}}, {{10,11,12}, {13,14}, {15}}};
flat_transfer(v, vv);
// prints "1 2 3 10 11 12 13 14 15 4 5 6 7 8 9"
for(const auto& i : v){
std::cout << i << " ";
}