C++ 返回对犰狳向量元素的引用
我很难确定如何返回犰狳向量元素的引用 e、 g 但是,这并不编译: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()返回一个副本而不是一个引用,但是前面的示例是如何工作的呢 我相信这可能是因为犰狳的胶水类型是返回的,而不
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); }