我可以用模板專門化來做到這一點,我認爲,嵌套1,2,3(最常見的情況下)通過分別嵌套1,2,3 for循環和引用類型的他們的類型名稱在stl ...但對於任意深度,不使用預處理器,有沒有辦法做到這一點?也許用mpl?或者我還需要預處理器工具嗎?現在我做這樣的事情:我怎樣才能進一步專注於這個模板的想法?
template<typename T, int>
struct MapDump {};
template<typename T >
struct MapDump<T,1>
{
static void dump(const T& map, string file, string header="")
{
if (!header.empty())
cout << header << endl;
for (typename T::const_iterator cIt = map.begin();
cIt != map.end();
++cIt)
cout << cIt->first << "," << cIt->second << endl;
}
};
template<typename T >
struct MapDump<T,2>
{
static void dump(const T& map, string file, string header="")
{
if (!header.empty())
cout << header << endl;
for (typename T::const_iterator it1 = map.begin();
it1 != map.end();
++it1)
for (typename T::mapped_type::const_iterator it2 = it1->second.begin();
it2 != it1->second.end();
++it2)
cout << it1->first << "," << it2->first << "," << it2->second << endl;
}
};
,我可以用打電話,例如:
map<int, map<int, double> > m;
m[1][1] = 1.0;
m[1][2] = 1.0;
m[2][1] = 2.0;
m[2][2] = 2.0;
MapDump< map<int, map<int, double> >, 2 >::dump(m, "test.csv");
(我剝出fstream的東西,左的std ::法院,以簡化示例代碼在這裏)我的問題是,當我說最後一層mapped_type是一個容器類型時,我該如何去專門研究?例如,map>在技術上是一個2深度的構造,而不是一個一級的構造......但是我的2個專業化的嵌套不能編譯爲這種類型......關於如何進一步抽象的任何其他建議(弄清楚編譯時的構造深度也是如此),謝謝!
燦你使用C++ 11和variadic模板? – jrok
您需要對嵌套的mapped_types進行遞歸處理,直到您到達死路一條,並沿途建立仿函數。我會盡力去做一些事情。 – pmr
@pmr是的,我雖然是遞歸下行遍歷,但我不得不坐下來思考它,如何像地圖>或地圖> >? –