Извращение
От: Chez Россия  
Дата: 23.09.04 12:09
Оценка: :))
Мне приснилось...
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
Re: Извращение
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 23.09.04 12:13
Оценка: :)
Здравствуйте, Chez, Вы писали:

C>Мне приснилось...[ccode]

C>class CAssert

Очевидно это был кошмар
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.