Мне приснилось...
class CAssert
{
public:
template<class T>
CAssert& operator ()(const T* p)
{
if (!AfxAssertIsValidAddress(p, sizeof(T), !IsConst(T)))
AfxAssertFailedLine(m_lpszFile, m_lpszLine);
return *this;
}
template<class T>
void operator [](const T* p)
{
if ((p != NULL) && !AfxAssertIsValidAddress(p, sizeof(T), !IsConst(T)))
AfxAssertFailedLine(m_lpszFile, m_lpszLine);
return *this;
}
// Тут ещё много всяких операторов и функций типа String(), operator ()(const CObject* p) и т.д.
// IsConst() - это метафункция, тут же в RSDN где-то про неё есть
CAssert& Prepare(LPCSTR lpszFile, int nLine) { m_lpszFile = lpszFile; m_nLine = nLine; return *this; }
private:
LPCSTR m_lpszFile;
int m_nLine;
};
CAssert Assert;
#define Assert (Assert.Prepare(__FILE__, __LINE__))
Используется так:
void MyFunc(CClass* p, CClass* p2 = NULL)
{
Assert(p);
Assert[p2];
// или
Assert(p)[p2];
}
На самом деле извращение гораздо более жуткое и там ещё много всего (_DEBUG и т.д.) но чтобы не захламлять показал основное...
Если кто увидит вызов функции\макроса в квадратных скобках — представляю выражение лица
Chez, ICQ# 161095094
Здравствуйте, Chez, Вы писали:
C>Мне приснилось...[ccode]
C>class CAssert
Очевидно это был кошмар
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.