2014-12-30 1 views
1

아르마딜로 벡터의 요소에 대한 참조를 반환하는 방법을 결정하는 데 어려움을 겪고 있습니다.아르마딜로 벡터 요소에 대한 참조 반환

struct Custom { 
    arma::vec3 v; 
    double& x() { return v.at(0) } 
} 
Custom custom; 
custom.x() = 1; 

오류는 다음과 같다 :

arma::vec3 v = arma::zeros(3); 
v.at(0) = 1; // works as expected, surely this means the at() method returns a reference? 

그러나이 컴파일되지 않습니다

error: invalid initialization of reference of type ‘double&’ from expression of type ‘const double’

나는()에서 대신 참조의 사본을 반환하기 때문에이 가정하지만, 이전 예제는 어떻게 작동합니까?

나는 이것이 실제 'double'보다는 오히려 반환되는 armadillo의 접착제 타입 때문일 수 있다고 생각하지만, 이것들에 대한 문서를 찾을 수 없으므로 사용 방법을 확신 할 수 없습니다.


대답

아래의 방법은 벡터 요소에 '참조 같은'라는 이름의 액세스를 제공, 작동합니다.

inline double x() const { return at(0); } 
inline double& x() { return at(0); } 

inline double y() const { return at(1); } 
inline double& y() { return at(1); } 

inline double z() const { return at(2); } 
inline double& z() { return at(2); } 

inline const arma::subview_col<double> xy() const { return rows(0,1); } 
inline arma::subview_col<double> xy() { return rows(0,1); } 
+2

두 번째 경우에는'x()'const를 만들었습니다. 'x()'다음에'const'를 잃거나,'arma :: vec3' 다음에 하나 추가하십시오. (또는 두 버전을 모두 제공하고 싶을 수도 있습니다.) –

+0

아 물론! 우수한! 그것은 작동하고있는 것 같습니다 :) –

답변

1

at(0) 거의 확실 double으로 변환 할 수 있고, 또는 double 할당가 수 프록시 객체를 반환 실제로 참조하지 않다. 이는 참조가 매달려 있지 않거나 스파 스 매트릭스의 효율적인 저장을 허용하는 것일 수 있습니다. Armadillo에 대한 documentation은 불행히도 의미에 대해 매우 조용하지만, at이 참조를 반환한다고 명시하지 않습니다.

이렇게하면 참조를 반환하지 않는 것이 좋습니다. 원하는 것을 성취 할 수있는 또 다른 방법이 있습니까?

+0

나는 Armadillo의 프록시 객체를 알고 있고, 당신은 그들의 문서가 부족하여 자신의 능력에 대해 확신이 없다는 점에서 옳다. 내 기본 목표는 at. (0) = 1 대신 at() 메서드의 명명 된 버전을 사용하는 것이 었습니다. v.x() = 3; 나는 getter와 setter를 가질 수 있다고 생각하지만 v.at (0) = 1이 작동 할 수있는 이유가 무엇인지 알지 못합니다. –

+0

'at'가 반환하는 글루 타입을 반환 할 수 있습니다 - 정확한 타입의 하드 코딩을 피하기 위해'auto' 또는'decltype'을 사용했을 것입니다. –

+0

접착제 유형이 무엇인지 알고 싶습니다. 나는 잠시 동안, 하하, 자동 및 decltype 사용하려고했는데 인스턴스가 후행 반환 형식 인 경우 범위에 있지 않기 때문에 멤버 함수와 함께 decltype을 사용할 수 없습니다. 올바른 구문을 얻는 데 문제가 있습니다. –