特征中的 typedef 与类中的 typedef

2023-11-25

我正在出于教育目的查看 Eigen 源代码。我注意到对于每个具体的类模板X在层次结构中,有一个internal::traits<X>定义的。一个典型的例子可以在 Matrix.h 中找到:

namespace internal {
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
struct traits<Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> >
{
  typedef _Scalar Scalar;
  typedef Dense StorageKind;
  typedef DenseIndex Index;
  typedef MatrixXpr XprKind;
  enum {
    RowsAtCompileTime = _Rows,
    ColsAtCompileTime = _Cols,
    MaxRowsAtCompileTime = _MaxRows,
    MaxColsAtCompileTime = _MaxCols,
    Flags = compute_matrix_flags<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::ret,
    CoeffReadCost = NumTraits<Scalar>::ReadCost,
    Options = _Options,
    InnerStrideAtCompileTime = 1,
    OuterStrideAtCompileTime = (Options&RowMajor) ? ColsAtCompileTime : RowsAtCompileTime
  };
};
}

现在,我将特征理解为扩展现有类的一种方式,您不想使用与某些新代码相关的额外信息来修改这些类。例如,类模板的用户Foo<class TAllocator>可能想利用现有的内存分配器FastAlloc and AlignedAlloc,但是 Foo 需要知道如何与这两者交互,因此FooTraits<AlignedAlloc>::allocate() and FooTraits<FastAlloc>::allocate()由用户定义,然后由用户使用Foo.

然而,在这种情况下,我并不能轻易地看到仅指定的问题Scalar在每个派生类中,即有Matrix define Matrix::Scalar在类主体中使用 typedef。使用特征类有什么好处?是否只是为了保持代码整洁,即将每个类的所有相关属性存储在特征类中?

根据 Nicol Bolas 的回复进行编辑:我知道其中一些 typedef 可能需要保留为“内部”,即不应暴露给用户,这将解释特征类。这似乎是有道理的,但是其中一些 typedef,例如Scalar, are通过基类中的 typedef 可供外界使用Matrix:

template<typename Derived> class MatrixBase
  : public DenseBase<Derived>
{
  public:

    typedef MatrixBase StorageBaseType;
    typedef typename internal::traits<Derived>::StorageKind StorageKind;
    typedef typename internal::traits<Derived>::Index Index;
    typedef typename internal::traits<Derived>::Scalar Scalar;
    typedef typename internal::packet_traits<Scalar>::type PacketScalar;
    typedef typename NumTraits<Scalar>::Real RealScalar;

这让我们回到了最初的问题:为什么不呢?Scalar只是一个 typedefMatrix本身?除了风格选择之外还有什么原因吗?


我怀疑,因为特征类是internal,这就是使用特征类的要点。也就是说,要保留这些东西internal。那样,Matrix即使在其私有接口中,也没有很多奇怪的定义等。

考虑您的示例中的枚举。那些“枚举”(又名:static constexprC++11 之前的变量)看起来不像用户应该了解的任何内容。这是一个实现细节,因此应该隐藏它。


MatrixBase的问题是CRTP问题。

See, Matrix定义如下:

class Matrix : public MatrixBase<Matrix>

这个部分定义会导致两件事发生:

  1. If Matrix尚未被声明为类类型,那么它就成为一个合法的类,其名称可以被引用和使用。

  2. 模板MatrixBase必须用类型实例化Matrix. 现在.

这里的问题是“现在”,Matrix is an 不完整的班级。编译器尚未进入该定义的主体,因此编译器对其内部结构一无所知。但MatrixBase必须立即实例化。

所以,MatrixBase不能使用任何contents of the Derived它提供了类。如果Matrix里面有一些 typedef,MatrixBase<Derived> cannot see it.

现在,成员函数MatrixBase<Derived>可以查看定义Derived,因为它们是在定义完整类之后定义的。即使这些函数是在类的范围内定义的。

但你不能拥有以下属性MatrixBase访问属性Derived。因此,特征是间接的。特征类可以使用基于不完整类型的专门化来将定义公开给MatrixBase.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

特征中的 typedef 与类中的 typedef 的相关文章

  • Qt 5 和 QProcess 使用信号/槽 read 重定向标准输出

    这个问题困扰着我 因为它应该有效 但遗憾的是它没有 我试图实现的是读取某个进程的标准输出并让另一个进程处理它 即打印出来 产生输出的过程如下所示 include
  • 无捕获 lambda 是结构类型吗?

    P1907R1 http www open std org jtc1 sc22 wg21 docs papers 2019 p1907r1 html 接受 C 20 引入结构类型 它们是非类型模板参数的有效类型 GCC 和 Clang 都接
  • 将 LUIS 与 FormFlow 集成

    我创建了一个机器人 里面有一个 FormFlow 现在 如果您输入 我想启动产品 LUIS 将告诉它必须转到哪个对话框 internal static IDialog
  • TPL Dataflow如何删除块之间的链接

    我想知道 如何删除块之间的链接 换句话说 我想要与 LinkTo 相反 我想写一个基于 tlp 数据流的记录器 我编写了这个接口 并希望在需要时删除 ILogListener 的订阅 public interface ILogManager
  • 创建动态对象

    如何动态创建对象 string columnNames EmpName EmpID PhoneNo List
  • 未定义的参考错误 - rand

    我正在创建一个命令行 C 测试应用程序 可执行 以便在我的 root Android 设备上运行 该可执行文件使用多个预构建的 C 库 其中之一使用 rand 在链接状态期间我收到错误 rand 的未定义引用 为了检查路径是否设置正确 我尝
  • 使用 C# 使用证书进行 SSL 客户端身份验证

    我需要创建一个 C 应用程序 该应用程序必须使用 SSL 向服务器发送 API 请求 我需要创建客户端身份验证 我已经拥有服务器 CA 证书 客户端证书 cer 客户端私钥 pem 和密码 我找不到有关如何创建客户端连接的示例 有人可以建议
  • 获取在 Unity 中实现接口的所有类型

    如果您只想知道解决方案 请跳至更新 我有一个应用程序 它使用以下代码来获取并运行许多工作方法 var type typeof IJob var types AppDomain CurrentDomain GetAssemblies Sele
  • PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本

    我正在使用 Npgsql 3 0 3 0 和 PetaPoco 最新版本 当我运行这个命令时 var dateCreated DateTime Now just an example var sql new Sql WHERE date c
  • send() 使我的程序崩溃

    我正在运行服务器和客户端 我正在我的计算机上测试我的程序 这是服务器中向客户端发送数据的函数 int sendToClient int fd string msg cout lt lt sending to client lt lt fd
  • Scala:需要类类型,但找到了 T

    我发现了与此特定问题类似的问题 但是该问题是由于有人试图直接实例化 T 造成的 在这里 我试图创建一个特征 它是一个通用接口来扩展类并将它们自动存储在数据库中 例如 Riak 使用classOf T 使用 Scala 2 10 这是我的代码
  • GridView必须添加到表单标签中才能渲染

    TextWriter tr new StringWriter HtmlTextWriter writer new HtmlTextWriter tr HtmlForm form new HtmlForm form Controls Add
  • 数据绑定问题,请解释

    public partial class Form1 Form MyClass myClass new MyClass one two public Form1 InitializeComponent textBox1 DataBindin
  • C# 如何在没有 GacUtil 的情况下在 GAC 中注册程序集?

    我需要使用批处理文件在 GAC 中注册程序集 有没有办法找到安装位置GacUtil exe或者有没有办法在没有 GacUtil 的情况下注册程序集 Your bestbet is to use a powershell script tha
  • allocator.construct 循环是否等于 std::uninitialized_copy?

    在此背景下T是某种类型并且allocator是该类型的分配器对象 默认情况下是std allocator
  • DateTimeFormat.AbbreviatedMonthNames 在月份名称末尾添加一个点

    昨晚 我们将 Web 服务层从物理 Windows 2008 r2 迁移到虚拟 Windows 2012 我们的日志中收到大量有关 DateTime 无效格式的事件 这很奇怪 因为我们仔细检查了区域设置 长话短说 CultureInfo G
  • 如何防止用户生成的 Sql 查询上的 Sql 注入

    我有一个项目 私有的 ASP net 网站 受 https 密码保护 其中要求之一是用户能够输入直接查询数据库的 Sql 查询 我需要能够允许这些查询 同时防止它们对数据库本身造成损坏 以及访问或更新它们不应该访问 更新的数据 我制定了以下
  • C# 多重继承

    目前我正在学习 C 和 ASP NET MVC 4代码优先方法 我是 Visual Basic 开发人员 现在我想开始 C 而且 现在我遇到了必须管理多重继承的情况 但是 对于Class i来说这是不可能的 那么 我应该如何管理我拥有的这些
  • 写入 Windows 7“预览”窗口区域

    如何使用 C 将控件写入或绘制到 Windows 7 预览区域 作为我正在讨论的示例 请在 Windows 7 中打开 Windows Media Player 并播放一首歌曲 播放歌曲时 最小化 Windows Media Player
  • 使用抽象类作为模板类型

    我对c 还是很陌生 来自java 我有一个 stl 类型列表Actor When Actor仅包含 真实 方法就没有问题 我现在想将这个类扩展到几个类 并且需要将一些方法更改为抽象的 因为它们不再具有具体的意义 正如我 从文档中 预期的那样

随机推荐

  • CP 求解器可以在特定点初始化吗?

    我正在使用 CP Sat 求解器来优化我正在制定的时间表 然而 现在这个问题需要很长时间才能解决 是否可以使用旧结果作为求解器的种子 作为起点 以减少找到最佳结果所需的时间 看看这个解决方案提示示例 https github com goo
  • 如何在 OSX El Capitan 上运行 Haskell

    我昨天刚刚升级到 Mac OSX El Capitan 发现我用来在终端上运行 Haskell 的方法不再起作用了 我曾经通过输入在终端上运行 Haskellcd the path where my hs file is in 然后输入gh
  • 为什么 C# 对 ushort 上的模运算发出错误“无法隐式地将 int 转换为 ushort”?

    在另一个帖子中 有人问为什么要添加两个ushort值在 C 中引发错误 例如 ushort x 4 ushort y 23 ushort z x y ERROR cannot implicitly convert int to ushort
  • Scala 解析器标记分隔符问题

    我正在尝试为下面的命令定义语法 object ParserWorkshop def main args Array String ChoiceParser todo link todo to database ChoiceParser to
  • 在 Linq 查询中调用类方法

    我有一个名为 GetAge DateTimebirthDay 的方法 我想在 Linq 查询中通过传递生日来使用此方法 并根据返回的年龄值需要执行一些逻辑 我想要以下 LINQ 格式的查询 from customer in contetx
  • 迭代@IntDef、@StringDef或任何@Def类中的值

    考虑这个类 public class MyClassOfMystery public static final int NO FLAGS 0 public static final int FIRST FLAG 1 public stati
  • Galaxy S4 上的浮动触摸

    三星 Galaxy S4 有 浮动触摸 功能 即使没有触摸屏幕也可以检测到手指 我想在按钮上触发一个事件 btn1 当手指经过时将其悬停 我尝试使用OnHoverListener but onHover当MotionEvent is Mot
  • 如何撤消 Git 中最近的本地提交?

    我不小心提交了错误的文件Git 但尚未将提交推送到服务器 我如何撤消这些提交local存储库 撤消提交并重做 git commit m Something terribly misguided 0 Your Accident git res
  • Oracle:Order by Union 返回 ORA-00933:SQL 命令未正确结束

    我在同时使用 Oracle 的 union 和 order by 子句时遇到问题 我有两个复杂的查询 其中包含子查询 每个查询都有一个 order by 子句 我需要合并两者的输出并返回结果 当我运行它时 我收到错误 ORA 00933 S
  • 使用扩展语法创建数组

    这是我在 React 书中找到的一个 JavaScript 箭头函数 const createArray length gt Array length 为什么不简单地返回一个新数组呢 const createArray length gt
  • 从故事板中的外部 xib 文件加载视图

    我想在故事板中的多个视图控制器中使用视图 因此 我考虑在外部 xib 中设计视图 以便更改反映在每个视图控制器中 但是如何从故事板中的外部 xib 加载视图 这是否可能 如果不是这种情况 还有哪些其他替代方案可以满足上述情况 我的完整示例是
  • 从具有行优先顺序的数组创建特征矩阵

    我有一个双精度数组 我想使用 Eigen 库创建一个 4 4 矩阵 我还想指定数据按行优先顺序存储 我怎样才能做到这一点 我已尝试以下操作 但无法编译 double data 16 Eigen Matrix4d M Eigen Map
  • 在 python 中将 XML 编辑为字典?

    我正在尝试从 python 中的模板 xml 文件生成自定义 xml 文件 从概念上讲 我想读入模板 xml 删除一些元素 更改一些文本属性 然后将新的 xml 写入文件 我希望它能像这样工作 conf base ConvertXmlToD
  • file_get_contents 会正常失败吗?

    I need file get contents具有容错能力 例如 如果 url喂给它返回一个404 在它发出警告之前告诉我 这可以做到吗 任何使用 HTTP 包装器访问远程文件 就好像它是本地文件一样 的函数都会自动生成一个名为的本地变量
  • 在java文件外部定义内部类

    我想创建一个类 ClassB 作为内部类ClassA 但我想写在外面ClassA java file 我怎样才能做到这一点 这将是很多内部类 并且ClassA java文件将是enormous UPDATE我真正想做的是定义十个类 它们只能
  • 有没有办法为 Spring HATEOAS `ControllerLinkBuilder` 设置主机和端口?

    Spring HATEOAS 提供了方便ControllerLinkBuilder创建指向控制器方法的链接 这些方法将作为 href 添加到返回给客户端的 JSON XML 中 例如 resource add linkTo methodOn
  • 跟踪(直接)文件下载的最佳方法

    跟踪直接文件下载的最佳方法是什么 Google Analytics 仅适用于 JavaScript 无法跟踪直接文件下载 最好的是安全且自己的托管解决方案 放心使用 htaccess RewriteEngine on RewriteRule
  • 为什么ORACLE很多表默认12c?

    创建一个新的数据库 基础和高级 这是我第一次接触Oracle 我不知道为什么有那么多表 触发器 视图和其他对象 而只想创建一个空的关系数据库 有没有其他方法可以做到这一点 或者有什么我错过理解的事情 谢谢 Capture 这些对象的所有者是
  • 如何删除 vscode 右侧滚动条上的符号?

    How can I remove the symbols on the right scrollbar in VSCode As per 这个 Github 问题 最近的解决方案是使用 useworkbench colorCustomiza
  • 特征中的 typedef 与类中的 typedef

    我正在出于教育目的查看 Eigen 源代码 我注意到对于每个具体的类模板X在层次结构中 有一个internal traits