operator->()->()
От: remark Россия http://www.1024cores.net/
Дата: 27.07.05 22:44
Оценка: 28 (7) :))) :))) :)
Я вот подумал, что если написать вот так:


class Base
{
public:
    void func()
    {}

    Base* operator->()
    {
        return this;
    }
};

int main(int, char*[])
{
    Base base;
    base.func();
    base->func();
    return 0;
}


И написал.

Функции можно вызывать и через точку и через стрелочку.

Дальше думаю, а что если написать ещё вот так:

class Base;

class Proxy
{
public:
    Proxy(Base* base)
        : m_base(base)
    {
        std::cout << "preprocess" << std::endl;
    }

    ~Proxy()
    {
        std::cout << "postprocess" << std::endl;
    }

    Base* operator->()
    {
        return m_base;
    }

private:
    Base* m_base;
};


class Base
{
public:
    void func()
    {}

    Proxy operator->()
    {
        return Proxy(this);
    }
};

int main(int, char*[])
{
    Base base;
    
    base->func();
    base.func();

    return 0;
}


И тоже написал.

Функции можно вызывать и через точку и через стрелочку. Причём через стрелочку можно прикрутить дополнительную обработку.

Дальше думаю, а что если написать ещё и вот так:

template<class Base>
class Proxy
{
public:
    Proxy(Base* base)
        : m_base(base)
    {
        std::cout << "preprocess" << std::endl;
    }

    ~Proxy()
    {
        std::cout << "postprocess" << std::endl;
    }

    Base* operator->()
    {
        return m_base;
    }

private:
    Base* m_base;
};

template<class T>
class Base : public T
{
public:
    Proxy<T> operator->()
    {
        return Proxy<T>(this);
    }
};

class Logic
{
public:
    void func()
    {
        std::cout << "Logic::func()" << std::endl;
    }
};

int main(int argc, char* argv[])
{
    Base<Logic> logic;
    
    logic->func();
    logic.func();

    return 0;
}


И тоже не обламался и написал.

Что-то типа умного указателя получилось. Хотя имеем непосредственно сам объект без всяких указателей.

А ещё думаю вот так можно изменить:

template<class T>
class Base : private T


Изменил.

Ну совсем как умный указатель получился — через точку вызывать нельзя, а через стрелочку можно.

Если сравнить с умными указателями, то отличается тем, что объект создаётся на стеке. Это умный указатель фактически является типом, на который "указывает", т.к. открыто унаследован от него. Можно обеспечить сразу два разных вида доступа — черз точку и через стрелочку.

...

И вот теперь сижу и думаю ЗАЧЕМ ЭТО ВСЁ НУЖНО???
Может у кого будут какие предложения...

1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.