美文网首页
C++ 自动类型推导

C++ 自动类型推导

作者: district10 | 来源:发表于2018-05-14 00:17 被阅读31次

在弄 g2o 图优化的时候,需要设置一条边的置信度,大概如下:

auto e = new g2o::EdgeSE3ProjectXYZ();
e->setVertex(0, optimizer.vertex(idPoint(pMPt->mnId)));
e->setVertex(1, optimizer.vertex(idImu__(0)));
e->setMeasurement(...);
e->setInformation(Eigen::Matrix2d::Identity() * pF->confidence); // 这一行很蛋疼
e->setRobustKernel(newRobustKernel());

那行设置 information 矩阵蛋疼在于,这个 info mat 的维度取决于你的 error 的维度。
也就是说如果 error 是 double[2],你就 Eigen::Matrix2d,如果 double[4],则是
Eigen::Matrix4d。很多时候容易搞错。然后 Eigen 就报错一堆东西出来(可能还不告诉你哪一行挂了)。

回顾一下 g2o 边的定义:

class EdgeSE3ProjectXYZ
    : public BaseBinaryEdge<2, Vector2d, VertexSBAPointXYZ, VertexSE3Expmap>
    // ...

这里 2 是 error 的维度(可能“维度”有歧义,就这个意思你懂得);Vector2d 是边的测量值类型
(通过 edge->setMeamurement 设置进去);后面就是两个顶点类型,分别对应 vertex 0 和 vertex 1。

昨天写了一个类型推导,这样就能自己从 Edge 类型里面推导出 info mat 的类型,不用自己去改
Matrix2d Matrix4d 这种东西。我查了挺久才找到我要的文档:http://en.cppreference.com/w/cpp/language/sfinae

写好这个自动推导后,设置 info mat 只需要这样调用:

e->setInformation(utils::helpers::information(f->confidence, e));

有没有觉得用起来很爽?

这里是实现:

template <typename T> struct E
{
    typedef typename T::InformationType InformationType;
};

template <typename T, typename W, typename = typename T::InformationType,
          typename U = typename E<T>::InformationType>
U information(W c, const T *t)
{
    return U::Identity() * c;
}

相关文章

  • C++型别推导1——模板推导

       自C++98开始,C++就具备了类型自动推导的能力。在11版本发布之前,C++只有一种类型推导方法,即模板类...

  • C++ 自动类型推导

    在弄 g2o 图优化的时候,需要设置一条边的置信度,大概如下: 那行设置 information 矩阵蛋疼在于,这...

  • C++ 11的类型推导 auto

    在声明变量时使用auto代替类型,C++编译器就会自动推导出变量的类型 sum被推导为int,使用auto声明的变...

  • 笔记---基础知识

    自动推导:var与let类型是根据右侧的代码,自动推导对应类型。在开发中极少使用直接指定类型,通常是自动推导 由于...

  • 现代 C++:自动类型推导

    自动类型推导 现代的编程语言,不管是动态语言(JavaScript、Python 等),还是静态语言(Go、Rus...

  • Item 1Understand template type d

    引子 模板类型推导是Modern C++特性auto的基础,但模板类型推导和auto类型推导有一些区别,具体看正文...

  • C++ auto 类型推导

    C++ auto 类型推导规则与模板类型推导[https://www.jianshu.com/p/6490ea37...

  • C++11带来的优雅语法

    自动类型推导 auto auto的自动类型推导,用于从初始化表达式中推断出变量的数据类型。通过auto的自动类型推...

  • 模板类型推导与auto

    本文聊聊C++中的模板类型推导和auto。两者其实是一样的,前者推导T的类型,后者推导auto的类型。本文初创于公...

  • 《Real World Haskell》笔记(2):类型与函数

    Haskell类型系统 静态、强类型检查使得 Haskell 更安全,而类型推导则让它更精炼、简洁。正是自动推导帮...

网友评论

      本文标题:C++ 自动类型推导

      本文链接:https://www.haomeiwen.com/subject/muirdftx.html