Re[2]: не совсем по теме
От: Vladimir Levchuk Украина  
Дата: 15.01.04 19:30
Оценка:
Здравствуйте, davenger, Вы писали:

D>Здравствуйте, WolfHound, Вы писали:


WH>>Сейчас читаю книжку Вандевурда и Джосатиса про шаблоны и там в операторах присваивания для проверки на присваивание к самому себе исползована такая конструкция

....
[skipped]

D>, и рядом с этим написан код типа:



D>
D>template <typename T> 
D> template <typename T2> 
D>Stack<T>& Stack<T>::operator= (Stack<T2> const& op2) 
D>{ 
D>    if ((void*)this == (void*)&op2) {    // assignment to itself? 
D>        return *this; 
D>    } 

D>    Stack<T2> tmp(op2);             // create a copy of the assigned stack 

D>    elems.clear();                  // remove existing elements 
D>    while (!tmp.empty()) {          // copy all elements 
D>        elems.push_front(tmp.top()); 
D>        tmp.pop(); 
D>    } 
D>    return *this; 
D>} 
D>


D>не понятен смысл проверки (void*)this == (void*)&op2


Кажется, дело в том, что здесь this и op2 — разных типов T* и T2*.
Если сравнивать this == op2, то фактически выполниться this == (T*) op2.
А привести ситуацию, когда ((void*) op2 != (void*) (T*) op2) совсем несложно:

#include <stdio.h>
struct A { int a; };
struct B { int b; };

struct C : public A, public B
{
    void test(B * p)
    {
        printf ("this %s p\n", 
            (this == p) ? "==" : "!=" );
        printf("(void*)this %s (void*)p", 
            ((void*)this == (void*)p) ? "==" : "!=");
    };
};

void main()
{
    C c;
    c.test(&c);
};


ЗЫ: хотя сложно представить ситуацию когда такое сравнение пригодится
--------------------------
WBR,
Leva mailto:leva@nm.ru,
ICQ: 106191183
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.