我有一堆等轴测图[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中,复制其行为的最佳方法是什么?
我试图使用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) 可以说,我有两个发动机类别(基于燃料类型,例如燃气或电动)
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类型,即ElectricCarEngine和GasCarEngine是一样的.它的故事ElectricPlaneEngine和GasPlaneEngine.
假设下面的内容编译:
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 ++模板中的菜鸟.
如果我需要澄清任何事情,请告诉我. …