저는 현재 원시 타입을 사용하여 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
으로 변환하고 싶다면
[rvalue] (http://stackoverflow.com/questions/3601602/what-are-rvalues-lvalues-xvalues-glvalues-glvalues-and-prvalues)과의 관계가 표시되지 않습니다. –
불필요한 C- 여기에 isms가 있습니다. –
@ LightnessRacesinOrbit 거의 10 년 동안 C로 프로그래밍 한 후에 C++의 표면을 긁어 모으고 있다는 점을 감안하면, 저를 가리킬 수 있습니다. :) – MVittiS