일부 멤버 함수와 함께 3 개의 double을 보유하기위한 구조체가 있다고 가정 해 봅시다.
struct Vector {
double x, y, z;
// ...
Vector &negate() {
x = -x; y = -y; z = -z;
return *this;
}
Vector &normalize() {
double s = 1./sqrt(x*x+y*y+z*z);
x *= s; y *= s; z *= s;
return *this;
}
// ...
};
이것은 단순함을 위해 약간 고안되었지만 유사한 코드가 거기에 있다는 데 동의합니다. 이 메소드를 사용하면 편리하게 연결할 수 있습니다. 예를 들면 다음과 같습니다.
Vector v = ...;
v.normalize().negate();
또는:
Vector v = Vector{1., 2., 3.}.normalize().negate();
이제 begin () 및 end () 함수를 제공하면 새로운 스타일의 for 루프에서 Vector를 사용할 수 있습니다. 예를 들어 x, y, z의 3 개 좌표를 반복 할 수 있습니다 (더 "유용한"예제를 작성할 수 있습니다. Vector를 예를 들어 String으로 대체하여) :
Vector v = ...;
for (double x : v) { ... }
우리는 할 수 있습니다 :
Vector v = ...;
for (double x : v.normalize().negate()) { ... }
그리고 또한:
for (double x : Vector{1., 2., 3.}) { ... }
그러나 다음 (나에게 보인다)이 깨졌습니다.
for (double x : Vector{1., 2., 3.}.normalize()) { ... }
이전 두 가지 사용의 논리적 조합처럼 보이지만이 마지막 사용은 매달린 참조를 생성하고 이전 두 가지 사용은 완전히 괜찮습니다.
- 이것이 정확하고 널리 평가됩니까?
- 위의 "나쁜"부분은 피해야하는 부분입니까?
- for-expression에 구성된 임시가 루프 기간 동안 존재하도록 범위 기반 for 루프의 정의를 변경하여 언어를 개선 할 수 있습니까?