2012-08-03 4 views
1

내가 이런 클래스 뭔가를 도트 연산자의 사용에 대한 운영자 캐스팅 이것을 할 수있는 방법 ((my point) .x) .x. 나는 -> 연산자를 오버로드 할 수 있음을 알고 있지만 포인터가 아닌 "척"한다고 가정하고 싶지는 않습니다.트리거

+0

static_cast (myPoint) .x'라고 말할 수 있습니다. –

+3

죄송합니다. – Xeo

+0

캐스트 연산자를'operator()'로 바꿀 수 있고 길이를 피하려고한다면'myPoint(). x; '를 사용할 수 있습니다. 그것은'operator->'보다 의미가 적습니다. – chris

답변

3

당신은 -> 대신 .의와비슷한 얻을 수 있습니다 다음

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; 
+0

@ Mr.Anubis 오, 네 말이 맞아. 그것은 바로 질문에서 복사되었습니다. –

+0

이것은 훌륭하지만 .GetValue() 연산자를 갖는 것이 더 합리적이지 않습니까? –

+2

@JohanLundberg 어떤 것이 더 합리적인지 알 수 있습니까? '래퍼 (wrapper) '가 무엇을해야할지 모르겠습니다. –

1

당신은 당신의 래퍼 클래스를 당신이 설명한 방법으로 진정한 클래스 척 할 수 없습니다를 . 주원인은 멤버 선택 (.) 연산자가 오버로드 될 수 없다는 것입니다.

+0

킨다 (Kinda)는 이것에 투표가 없다는 것에 놀랐습니다. 간단하지만 대답은 간단합니다 ... _ 현재 있습니다. '운영자'에 대한 지속적인 추진이 있습니다. https://isocpp.org/blog/2016/02/a-bit-of-background-for-the-operator-dot-proposal-bjarne-stroustrup 명시 적 액세스를 처리 할뿐만 아니라 '.'에 의해, 이것은 클래스에 정의되지 않은 _all_ 액세스 (예 :'operator =')를 납치하고'연산자의 결과에 전달합니다 .'이 제안됩니다.이 암묵적인 역할이 너무 넓고 위험하고 범위를 벗어난 것으로 보입니다 그것의 이름에, & 게으른 : 당신이 통신 수를 전진하고 싶은 경우에, 그 (것)들을 쓰십시오 ... 그러나 Bjarne는 계획안의 저자의 한개, 이렇게이다! –