Задействайте оператора за прехвърляне при използване на оператора точка

Имам клас нещо подобно:

template<typename T>
class wrapper
{
public:
    operator const T & () const
    {
        return value;
    }
private:
    T value;
};

След това го използвам със структура като тази:

struct point { float x; float y; };

//...

wrapper<point> myPoint;
std::cout << myPoint.x;// error: no member x or whatever.

Чудя се дали има начин да се позволи това, без да се налага да се прави ((point)myPoint).x. Знам, че мога да претоваря оператора ->, но бих предпочел да не го правя, тъй като той трябва да се "преструва", че не е указател.


person Francisco Ryan Tolmasky I    schedule 03.08.2012    source източник
comment
Можете да кажете static_cast<point const &>(myPoint).x.   -  person Kerrek SB    schedule 03.08.2012
comment
Можете да промените оператора за прехвърляне на operator() и да използвате myPoint().x;, ако дължината е това, което се опитвате да избегнете. Все пак има по-малко смисъл от operator->.   -  person chris    schedule 03.08.2012


Отговори (2)


Можете да постигнете нещо подобно с -> вместо .:

template<typename T>
class wrapper
{
public:
    operator const T & () const // will this still be needed now?
    {
        return value;
    }

    T* operator->() { return &value; }
    T const* operator->() const { return &value; }

private:
    T value;
};

И тогава:

struct point { float x; float y; }

//...

wrapper<point> myPoint; // this needs to be initialised!
std::cout << myPoint->x;
person R. Martinho Fernandes    schedule 03.08.2012
comment
@Mr.Anubis о, да, прав си. Това беше копирано направо от въпроса. - person R. Martinho Fernandes; 03.08.2012
comment
Това е хубаво и всичко останало, но няма ли да има повече смисъл да има оператор .GetValue()? - person Johan Lundberg; 03.08.2012
comment
@JohanLundberg Как мога да разбера кое има повече смисъл? Не знам какво трябва да бъде wrapper. - person R. Martinho Fernandes; 03.08.2012
comment
@JohanLundberg: Проблемът е, че не можете да направите това с .. Сред алтернативите operator-> е тази, която вероятно има най-голям смисъл. - person David Rodríguez - dribeas; 03.08.2012

Не можете да накарате вашия клас обвивка да се преструва, че е истински клас по начина, който описахте. Основната причина е, че операторът за избор на член (.) не може да бъде претоварен.

person shargors    schedule 03.08.2012
comment
Малко изненадан, че няма гласове. Кратко е, но отговорът е толкова прост... в момента. Има текущ натиск за operator. isocpp.org/blog/2016/02/ Освен обработката на изрични достъпи от ., това се предлага за отвличане на всички достъпи (напр. operator=), които не са дефинирани в класа & препратете тези към резултата от operator. Притеснявам се, че тази неявна роля изглежда твърде широка, рискована, извън обхвата спрямо името си и мързелива: ако искате да препратите оператори, напишете ги... Но Bjarne е едно от предложенията автори, значи! - person underscore_d; 07.08.2016