我想做一个函数debug
,输出一些关于对象的信息。我的系统包含许多不同类型的对象;其中一些包含其他对象。
using namespace std; // for brevity
struct dog {string name;};
struct human {string name; string address;};
struct line {list<human*> contents;};
struct pack {vector<dog*> contents;};
我希望函数输出name
参数的成员(如果有的话),或者调试contents
参数的成员(如果有的话)。我想出了以下代码:
template <class T>
void debug(T object) // T here is a simple object like dog, human, etc
{
cout << object.name.c_str() << '\n';
}
// A helper function, not really important
template <class T>
void debug_pointer(T* object)
{
debug(*object);
}
void debug(pack object)
{
for_each(object.contents.begin(), object.contents.end(), debug_pointer<dog>);
}
void debug(line object)
{
for_each(object.contents.begin(), object.contents.end(), debug_pointer<human>);
}
在这里, 和 的代码pack
几乎line
相同!我想避免多次编写相同的代码:
struct line {list<human*> contents; typedef human type;};
struct pack {vector<dog*> contents; typedef dog type;};
template <class T>
void debug(T object) // T here is a compound object (having contents)
{
for_each(object.contents.begin(), object.contents.end(), debug_pointer<T::type>);
}
但是这种语法与“简单”对象的函数模板冲突(具有相同的签名)。
我怎样才能重写我的代码?我不想重写第一部分(对 , 等的声明dog
)human
,因为我的程序的那部分已经非常复杂,并且只是为了调试而向其中添加东西(基类、成员函数等)似乎不合适。