小编iNF*_*TEi的帖子

如何在Eigen中表示紧致等距变换矩阵?

我有一堆等轴测图[R | t]变换矩阵,即它们是3D刚性变换.目前我将它们存储为Eigen仿射变换,以紧凑形式表示,例如Eigen::AffineCompact3d,它不存储[0 0 0 1]的冗余最后一行.

我也知道有一个Eigen::Isometry3d我认为是typedef的Transform<double, 3, AffineCompact, Isometry>.

我在Isometry之后,逆转换比一般仿射逆更便宜(转置).当我使用inverse()时,我也知道我可以传递一个提示affine_mat.inverse(Eigen::Isometry);

但是我希望在没有每次手动传递提示的情况下获得等距逆行为.换句话说,我想知道,Eigen::IsometryCompact3d在Eigen API中,复制其行为的最佳方法是什么?

c++ transformation eigen

5
推荐指数
1
解决办法
1866
查看次数

将自定义类型与Boost程序选项一起使用

我试图使用Boost ProgramOptions来解析配置文件以初始化我自己的类类型Dataset(下面的代码)

我将选项添加为:

config_.add_options()("dataset", po::value<Dataset>()->required(),"Dataset");
Run Code Online (Sandbox Code Playgroud)

我的数据集类定义如下:

#ifndef DATASET_H_
#define DATASET_H_

#include <boost/algorithm/string/predicate.hpp>

class Dataset {
public:
  enum Name {
    JAVA, SUMATRA, ASIA, AFRICA
  };

  Dataset(Name name = JAVA) : name_(name) {}
  operator Name () const {return name_;}

  std::string asString() const;

private:
  Name name_;

  //prevent automatic conversion for any other built-in types such as bool, int, etc
  template<typename T>
  operator T() const;
};

inline std::string Dataset::asString() const {
  if (name_ == Dataset::JAVA)
    return "JAVA";
  else if (name_ == Dataset::SUMATRA)
    return "SUMATRA"; …
Run Code Online (Sandbox Code Playgroud)

c++ boost command-line-arguments boost-program-options

3
推荐指数
1
解决办法
2542
查看次数

如何在CRTP的基类上模板化Derived类

可以说,我有两个发动机类别(基于燃料类型,例如燃气或电动)

template<class Derived>
class ElectricEngine {};
Run Code Online (Sandbox Code Playgroud)

template <typename Derived>
class GasEngine {};
Run Code Online (Sandbox Code Playgroud)

现在说我想制作,CarEngine并且PlaneEngine每个都可以选择上述基类之一.我还需要做CRTP(静态多态).所以这样做的直接方法如下:

class ElectricCarEngine : public ElectricEngine<ElectricCarEngine> {};
class GasCarEngine : public GasEngine<GasCarEngine> {};

class ElectricPlaneEngine : public ElectricEngine<ElectricPlaneEngine> {};
class GasPlaneEngine : public GasEngine<GasPlaneEngine> {};
Run Code Online (Sandbox Code Playgroud)

以上作品,但其大量的冗余代码,因为我的每一个方法的CarEngine类型,即ElectricCarEngineGasCarEngine是一样的.它的故事ElectricPlaneEngineGasPlaneEngine.

假设下面的内容编译:

template <typename Base>
class CarEngineInterface : public Base<CarEngineInterface<Base> > {};
Run Code Online (Sandbox Code Playgroud)

然后我们可以重用此类来CarEngine通过简单的typedf 创建任何类型.例如:

typedef CarEngineInterface<ElectricCarEngine> ElectricCarEngine;
typedef CarEngineInterface<GasCarEngine> ElectricCarEngine;
Run Code Online (Sandbox Code Playgroud)

然而,由于循环依赖性,这会失败.我怎样才能达到类似的效果?

是否有一些特质可以解决这个问题?(与用于在CRTP中从基类引用派生类typedef的那些一样)

我在使用C++ 99,但我可以使用Boost.我也是c ++模板中的菜鸟.

如果我需要澄清任何事情,请告诉我. …

c++ templates traits crtp

2
推荐指数
1
解决办法
388
查看次数