2016-09-28 6 views
0

저는 현재 원시 타입을 사용하여 setter 및 getter를 가져올 수있는 코드를 리팩터링하려고합니다. 기본 코드의 변경을 투명하게 만들고 싶었습니다. 처음에는 C++의 연산자 오버로드가 저를 도와주었습니다.C++ 제네릭 rvalue 오버로드

의이 내가이 예를 들어, 그 단지 일반 int처럼 취급 할 수있다, 유형 "int을 증강"만들고 싶어 가정하자,하지만 난 그것에 할당 할 때마다 추가 조치를 허용, 그냥 할당 -의 다른 모든 속성 +=으로 추가하는 것과 같이 int을 보존해야합니다. 나는 어떤 구조체 내부의 int을 캡슐화하고, operator= 과부하를 작성하는 경우 먼저 내가 먼저

는, 나는 다음 예에서와 같이 설정 될 거라고하지만 :

#include<iostream> 

typedef struct PowerInt{ 
    int x; 

    PowerInt(){ 
    cout << "PowerInt created\n"; 
    x = 0; 
    } 
    ~PowerInt(){ 
    cout << "PowerInt destroyed\n"; 
    } 

    void operator=(int other){ 
    cout << "PowerInt received " << other << "\n"; 
    this->x = other; 
    } 
}PowerInt; 

int main(){ 
    PowerInt a; 
    a = 3; 
    return 0; 
} 

코드는 컴파일 및 실행 예상대로,하지만 일반 정수가 수행 할 수있는 다른 작업 (예 : cout << a 또는 a += 2)을 작성하자마자 또는 컴파일러가 <<+= 연산자가 누락되었다고 컴파일러가 불평 할 수도 있습니다.

충분; 그렇다면 적어도 <<과 "assigment ="에 대해서는 "generic rvalue operator"또는 일종의 PowerInt.x을 반환 할 수 있습니다. 내 a이 rvalue로 사용되면 자동으로 다음과 같은 표현을 사용합니다. int c = (a + 3);if (a == 3) {}이 유효합니다.

문제는이 관용구를 구현할 수있는 방법을 찾을 수 없으며, 이는 대부분 C++에서 연산자 오버로딩이 작동하는 방식에 대한 약간의 이해 또는 아직 인식하지 못하는 언어 기능과 관련이 있습니다. . 내가 여기서하려고하는 것을 성취 할 수 있습니까? 당신이 당신의 PowerInt 당신이 사용자 정의 변환 연산자를 만들 수 있습니다 정상 int으로 변환하고 싶다면

+1

[rvalue] (http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-glvalues-and-prvalues)과의 관계가 표시되지 않습니다. –

+0

불필요한 C- 여기에 isms가 있습니다. –

+0

@ LightnessRacesinOrbit 거의 10 년 동안 C로 프로그래밍 한 후에 C++의 표면을 긁어 모으고 있다는 점을 감안하면, 저를 가리킬 수 있습니다. :) – MVittiS

답변

0

:

operator int() const 
{ 
    return x; 
} 

다음 int 정상에 정의 된 연산자를 사용합니다 PowerInt에 대해 정의하지 상관 없음 연산자 .

피씨 typedef struct은 C++에서 필요하지 않습니다.

+0

어리석은, 어리석은 나. 이것은 제가 의도 한 정확한 방법으로 문제를 해결합니다. – MVittiS