我喜歡@ inflagranti的想法 - 所以,沒有聲稱實用,這裏是一個for-each模板,遍歷所有內容。它使用來自pretty printer的is_container
特徵,我不在這裏複製。
更新:現在全面解決了裸價值類型和雙值類型。
更新2:由於@Luc Danton,簡化了實現類。
#include <algorithm>
#include "prettyprint.hpp"
using namespace pretty_print; // for "is_container" trait
template <typename T> struct is_pair : public std::false_type { };
template <typename S, typename T> struct is_pair<std::pair<S,T>> : public std::true_type { };
template <typename T> struct final_value { typedef T type; };
template <typename S, typename T> struct final_value<std::pair<S,T>> { typedef T type; };
template <typename Iter, typename F> void for_each_recursive(Iter begin, Iter end, F f);
template <typename F, bool Recurse> struct for_each_rec_impl;
template <typename F>
struct for_each_rec_impl<F, false>
{
template <typename Iter>
static typename std::enable_if<is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it) f(it->second);
}
template <typename Iter>
static typename std::enable_if<!is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it) f(*it);
}
};
template <typename F>
struct for_each_rec_impl<F, true>
{
template <typename Iter>
static typename std::enable_if<is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it)
{
for_each_recursive(it->second.begin(), it->second.end(), f);
}
}
template <typename Iter>
static typename std::enable_if<!is_pair<typename std::iterator_traits<Iter>::value_type>::value, void>::type
go(Iter begin, Iter end, F f)
{
for (Iter it = begin; it != end; ++it)
{
for_each_recursive(it->begin(), it->end(), f);
}
}
};
template <typename Iter, typename F>
void for_each_recursive(Iter begin, Iter end, F f)
{
typedef typename std::iterator_traits<Iter>::value_type value_type;
typedef typename final_value<value_type>::type type;
for_each_rec_impl<F, is_container<type>::value>::go(begin, end, f);
}
用法:for_each_recursive(v.begin(), v.end(), my_predicate<final_value_type>);
不......... –
爲什麼你有這樣的深度嵌套的地圖和引導?與其試圖迭代你的map-of-a-map -... of-a-vector,可能有更好的方法來構造你的代碼,使它變得沒有必要。 – Alex
你很清楚地意識到,這已經有點遠了,因爲你不願意編寫七個嵌套for循環,但是如果你有七個嵌套的地圖,你還能做什麼?這有點荒謬,必須有另一種選擇。如果你解釋你想達到的目標,有人會建議更好的方法。 – john