私が思うに、テンプレートの特殊化でこれを行うことができます。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::cout を残しました) 私の質問は、たとえば、最後のレベルの maps_type がコンテナー型である場合、どうすれば特殊化できるのでしょうか? たとえば、 map > は技術的には 2 層構造であり、1 レベルの構造ではありません...しかし、2 つの特殊化のネストはそのタイプに対してコンパイルされません...方法に関する他の提案、おそらくこれをさらに抽象化する (理解するコンパイル時の構造の深さも) 歓迎..ありがとう!