C++ 返回对犰狳向量元素的引用

C++ 返回对犰狳向量元素的引用,c++,armadillo,C++,Armadillo,我很难确定如何返回犰狳向量元素的引用 e、 g 但是,这并不编译: struct Custom { arma::vec3 v; double& x() { return v.at(0) } } Custom custom; custom.x() = 1; 错误如下: 错误:从“const double”类型的表达式初始化“double&”类型的引用无效 我假设这是因为at()返回一个副本而不是一个引用,但是前面的示例是如何工作的呢 我相信这可能是因为犰狳的胶水类型是返回的,而不

我很难确定如何返回犰狳向量元素的引用

e、 g

但是,这并不编译:

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

错误:从“const double”类型的表达式初始化“double&”类型的引用无效

我假设这是因为at()返回一个副本而不是一个引用,但是前面的示例是如何工作的呢

我相信这可能是因为犰狳的胶水类型是返回的,而不是真正的“双”,但我找不到任何关于这些的文档,所以我不确定如何使用它们


回答

下面的方法起作用,提供对向量元素的“类引用”命名访问

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); }
inline double x()常量{return at(0);}
内联双精度&x(){return at(0);}
内联双y()常量{return at(1);}
内联双精度&y(){return at(1);}
内联双z()常量{return at(2);}
内联双精度&z(){return at(2);}
内联常量arma::子视图_col xy()常量{返回行(0,1);}
内联arma::子视图_col xy(){返回行(0,1);}
at(0)
几乎肯定会返回一个代理对象,该对象可以转换为
double
,或者被指定为
double
,但实际上不是一个引用。这可能是为了避免悬空引用,或者允许有效存储稀疏矩阵。不幸的是,Armadillo的函数在语义上非常安静,但是它没有指定
at
返回一个引用


这表明您不希望返回推荐信。有没有其他方法可以实现您的目标?

我知道Armadillo的代理对象,您是对的,因为它们的文档缺乏,所以我不确定它们的功能。我想我的主要目标是要有一个at()方法的命名版本,这样代替v.at(0)=1;我可以得到v.x()=3;我想我可以有一个getter和setter,但是如果v.at(0)=1可以工作,我不明白为什么我需要这样做。你可以总是返回
at
返回的粘合类型-可能使用
auto
decltype
来避免硬编码精确的类型。我很想知道粘合类型是什么!我已经尝试使用auto和decltype有一段时间了,哈哈,但是我不能将decltype与成员函数一起使用,因为在尾部返回类型中,实例不在范围内。获取正确语法时遇到问题。
decltype(std::declval)原来const函数修饰符实际上一直是根本问题,我更新了答案以避免使用decltype,因为它更简单。在第二种情况下,您使用了
x()
const。要么在
x()之后丢失
const
,要么在
arma::vec3
之后添加一个。(或者你可能想提供两个版本。)啊,当然!杰出的它似乎正在工作:)
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); }