鱼C论坛

 找回密码
 立即注册
查看: 1493|回复: 3

cast问题

[复制链接]
发表于 2023-4-12 14:56:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
程序段如下:
以下是一个结构体:
template<typename T>
struct Twist {
  Eigen::Quaternion<T> rot;
  Eigen::Matrix<T, 3, 1> pos;

  static Twist Identity() {
    return Twist();
  }

  Twist() {
    rot.setIdentity();
    pos.setZero();
  }
Twist(Eigen::Quaternion<T> rot_in, Eigen::Matrix<T, 3, 1> pos_in) {
    this->rot = rot_in;
    this->pos = pos_in;
  }
........
  template<typename NewType>
  Twist<NewType> cast() const {
    Twist<NewType> twist_new{this->rot.template cast<NewType>(), this->pos.template cast<NewType>()};
    return twist_new;
  }
.........
////////////////
下面是调用:
Twist<float> full_transform = .....;
transform_sum_.rot.normalized().toRotationMatrix().cast<double>();  

问题:
rot.normalized().toRotationMatrix() 这个是理解的,关键是后面的cast会有返回值吗?
结构体中this->rot.template cast<NewType>(“这里是空的,所以不应该是空的吗?”) 感觉是定义了结构体中一个空的Eigen::Quaternion呀?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-12 15:04:06 | 显示全部楼层
在给出的代码片段中,cast() 成员函数的定义是在 Twist 结构体中的。该函数的主要作用是将一个 Twist<T> 对象转换为一个 Twist<NewType> 对象。在此过程中,rot 和 pos 成员都将转换为新类型。

在这个例子中,transform_sum_.rot.normalized().toRotationMatrix().cast<double>() 调用了 cast() 函数,它将把 rot 成员(表示四元数)转换为一个归一化的旋转矩阵,然后将其类型从 float 转换为 double。这里的 cast() 函数确实有返回值,它将返回一个新类型的 Twist<NewType> 对象。

this->rot.template cast<NewType>() 和 this->pos.template cast<NewType>() 这两行代码中,cast<NewType>() 函数调用是针对 Eigen 类库中的 Quaternion 和 Matrix 类型的。在这种情况下,它们会返回一个新类型的 Eigen::Quaternion<NewType> 和 Eigen::Matrix<NewType, 3, 1> 对象。

总之,结构体中的 cast() 成员函数将返回一个新类型的 Twist<NewType> 对象,该对象的 rot 和 pos 成员将转换为新类型。在这个例子中,将会返回一个 Twist<double> 对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-12 15:42:50 | 显示全部楼层
isdkz 发表于 2023-4-12 15:04
在给出的代码片段中,cast() 成员函数的定义是在 Twist 结构体中的。该函数的主要作用是将一个 Twist 对象 ...

首先非常感谢,
Twist<NewType> twist_new{this->rot.template cast<NewType>(), this->pos.template cast<NewType>()}
我还是不太明白,上面的代码大括号中其实是对结构体进行了初始化,
this->rot.template cast<NewType>()  数据在哪里?感觉像数据在前,数据类型在后呢? cast<int> b;这种形式是理解的,但this->rot.template cast<NewType>() 还是有点迷惑,同时我理解就算matrix中有cast函数,但是为什么不是this->rot.template.cast<NewType>()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-12 19:18:13 | 显示全部楼层
这段代码实现了一个名为twist的结构体,其中包含一个旋转部分和一个平移部分。在这个结构体中,有一个名为cast()的成员函数,用于将twist对象的模板类型转换为另一种类型,返回转换后的新类型的twist对象。

在调用这个函数时,使用了c++中的模板语法,即通过关键字template来指定要进行类型转换的新类型newtype。具体而言,通过对rot和pos成员变量调用eigen库中matrix和quaternion类中的cast()函数,将它们的数据类型从当前类型转换为newtype类型。

这里需要注意的是,在调用cast()函数时,因为rot是一个eigen::quaternion类型的变量,而这个类是一个模板类,所以需要使用rot.template cast<newtype>()的形式。这里的template关键字告诉编译器,cast()是quaternion模板类中的一个模板函数,需要进行模板参数推断。

至于为什么不是this->rot.cast<newtype>(),这是因为cast函数也是一个模板函数,如果直接使用this->rot.cast<newtype>()会导致编译器无法正确解释这个表达式的含义。因此需要加上template关键字以明确指出这是一个模板函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-25 09:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表