私は1,2,3(最も一般的なケース)の入れ子のために、それぞれ1,2,3のループを入れ子にし、型名を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のを取り除かここで)私の質問は、例えば、最後のレベルのmapped_typeがコンテナタイプであるときに、どのように専門化することができますか?たとえば、map>は技術的に2レベルの構造であり、1レベルの構造ではありませんが、2特殊化のネストはそのタイプではコンパイルされません...その他の方法については、コンパイル時のコンストラクトの深さも)welcomeです.thanks!
缶あなたはC++ 11とvariadicテンプレートを使用しますか? – jrok
途中で詰まったmapped_typesを再帰的に処理し、途中で行き止まりになり、途中でファンクタを構築する必要があります。私は何かをしようとします。 – pmr
@pmrはい私は再帰的な下降を考慮していますが、座ってそれをもっと難しく考える必要があります。map>やマップ> >? –