Я хочу создать функцию с именем 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
и т. Д.), Потому что эта часть моей программы уже очень сложна, и для нее добавляются вещи (базовые классы, функции-члены и т. Д.) Только дляотладка кажется неуместной.