我可以通过我认为的模板专业化来做到这一点,对于 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 以简化此处的示例代码)我的问题是,当最后一级 mapped_type 是容器类型时,我该如何进行专业化?例如 map > 在技术上是一个 2-depth 构造,而不是一个单级构造...但是我的 2 个专业化嵌套不会为该类型编译...任何其他关于如何的建议,也许进一步抽象 thsi(弄清楚欢迎在编译时构造的深度)..谢谢!