派生类中的 sizeof(*this) 和 decltype(*this)

2024-03-10

假设有类:

struct A {
  int a;

  virtual size_t GetMemoryUsage() const {
    return sizeof(*this);
  }
};

struct B : public A {
  int b;
};

而且可能还有更深层次的传承。

我想要的是有一个方法可以返回对象在内存中占用的字节数,GetMemoryUsage()在这种情况下。通常可以通过使用来实现sizeof(*this)。问题是(至少 AFAIU)我必须重写每个派生类中的方法并实际复制粘贴其主体。我不喜欢重复的代码:)

我对么?我怎样才能使sizeof(*this) and decltype(*this)通过仅从基类的方法调用子类来返回我想要的子类?有更优雅的解决方案吗?


您不必实施GetMemoryUsage对于每个手动派生类,只需将其保留为纯虚拟类。例如。:

struct A
{
    virtual ~A() = default;
    virtual size_t GetMemoryUsage() const noexcept = 0;
};

struct B : A
{
    int b;
};

然而,当创建对象时,必须实现该功能。您可以使用工厂函数来做到这一点,该函数用纯虚拟的通用实现来“装饰”该类:

// Can alternatively be defined inside function template create.
template<class T>
struct GetMemoryUsageImpl : T
{
    using T::T;
    size_t GetMemoryUsage() const noexcept final {
        return sizeof(T);
    }
};

template<class T, class... Args>
std::unique_ptr<T> create(Args&&... args) {
    return std::unique_ptr<T>(new GetMemoryUsageImpl<T>(std::forward<Args>(args)...));
}

Usage:

void f(A& a) {
    auto object_size = a.GetMemoryUsage();
}

int main() {
    auto b = create<B>();
    f(*b);
}

您还可以使用此习惯用法轻松地逐步实现接口层次结构。 https://stackoverflow.com/a/16648036/412080

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

派生类中的 sizeof(*this) 和 decltype(*this) 的相关文章

随机推荐

  • 如何在Linux中找到处理器队列长度

    尝试确定 Linux 计算机上的处理器队列长度 准备运行但当前未运行的进程数 Windows 中有一个针对此指标的 WMI 调用 但对 Linux 不太了解 我正在尝试挖掘 proc 和 top 以获取信息 有没有办法确定CPU的队列长度
  • JavaScript setInterval 限制?

    我有一个使用 JavaScript 的应用程序setInterval 运行数字时钟 我想知道它执行此函数的次数是否有超时或限制 setInterval 将无限运行 如果您希望终止 循环 可以使用clearInterval 例如 var co
  • 红宝石案例陈述与比较[重复]

    这个问题在这里已经有答案了 有没有办法使用caseruby 中整数比较的语句 我发现了很多比较字符串的例子 但是我的case下面的示例因语法错误而失败 def get price rank price case price when lt
  • 升级到 Xcode 8.2.1 后,iOS 模拟器无法在代理后面工作?

    我正在需要身份验证的代理环境中工作 由于我已升级到 Xcode 8 2 1 模拟器停止工作 但它在 Xcode 8 1 和 7 3 上运行良好对此有任何帮助吗 这是我收到的错误 PAC 获取失败并出现错误 NSURLErrorDomain
  • 在shell脚本中打印C程序的输出

    我有一个程序 我必须使用一个 c 程序将开尔文转换为远 反之亦然 我需要输出方面的帮助 它应该从我放入 file 和用户的 choice 中的数据文件中读取 并在 c 程序文件 farh kel 中运行它 while read val do
  • 禁用某些图像的缓存

    我使用 PHP 库生成一些图像 有时浏览器不会加载新生成的文件 如何仅对我动态创建的图像禁用缓存 注意 随着时间的推移 我必须对创建的图像使用相同的名称 解决这个问题的一个常见而简单的解决方案是向每个动态图像请求添加一个随机生成的查询字符串
  • 头文件中的 const 变量和静态初始化惨败

    在阅读了很多有关静态变量初始化的问题后 我仍然不确定这如何适用于const命名空间级别的变量 我有以下代码header file config h由构建脚本生成 static const std string path1 xyz abc s
  • ExtJS:将 html 表单转换为 ExtJS

    我希望能够将 html 表单转换为 ExtJs 表单 我读到您必须使用 applyTo 做一些事情 但不太确定该怎么做 我希望有人能为我提供一些帮助 Cheers 如果你想将表单中的每个元素转换为 ExtJS 元素 有人在煎茶论坛 http
  • QMediaPlayer 未定义引用链接器错误

    我安装了 Qt5 由于 Qt5 不支持 Phonon 我被迫使用其他东西 所以我决定使用 QtMultimedia 轮廓 QT core gui CONFIG mobility MOBILITY multimedia cpp代码 inclu
  • 用于重新加载部署的 WildFly CLI 命令

    我可以重新启动运行以下 Java 代码的整个 WildFly 服务器 但我只想重新加载名为 test war 的部署 怎么可能呢 public void flushall throws IOException Runtime getRunt
  • Angular FormArray 内容顺序

    Hya 我有以下设置 App Component Ts 内容 carForm FormGroup constructor private fb FormBuilder this carForm this fb group name type
  • 未配置 SQL 方言 (Phpstorm)

    我正在研究 Google oauthorization2 并遇到问题 未配置 SQL 方言 这就是为什么我的查询没有执行并且数据将进入表的原因 我在下面列出了我遇到问题的两个查询 工具 PhpStorm 8 MySQL 本地主机 user
  • 签署 mac 安装程序 (pkgmaker)

    我的安装程序是使用 PackageMaker 创建的 之后 我使用以下命令对安装程序进行了代码签名 产品签名 签名 Blah Inc 安装 mpkg CS 安装 mpkg 这似乎工作得很好 我可以看到它是使用以下命令签名的 pkgutil
  • 在Linux中,有没有办法找出哪个PCI卡插入哪个PCI插槽?

    在Linux中 有没有办法找出哪个PCI卡插入哪个PCI插槽 sys bus pci devices 包含许多不是卡的设备 桥 CPU 通道等 我无法在设备目录中找到有关插槽卡映射的任何信息 您可以使用 dmidecode t slot 查
  • 事件处理顺序

    Javascript jQuery 事件处理 如果事件 例如 点击 为父元素绑定了一个函数 为子 DOM 元素绑定了另一个处理函数 那么会调用哪一个函数 如果全部都被调用 那么按什么顺序调用 事件在 DOM 树中 向上 冒泡 因此如果您有某
  • 如何使用 ng-repeat track by $index 创建的量角器选择元素?

    我需要选择 ng repeat 创建的文本框并使用 sendKeys 函数发送一些值 但我不确定选择文本框的方法 请建议一种方法来完成此任务 或者我应该使用 css 选择器来代替 div class qst input hld ng sco
  • 使用 fopen 时出现段错误

    我从以下代码的第二行收到段错误 FILE output NULL output fopen output2 txt w 我不认为这是某种损坏的内存错误 因为当我将 w 更改为 r 时 它运行时没有段错误 另外 它似乎是在出现段错误之前创建该
  • ng-show/ng-if 不会立即更新 dom 高度

    我有一个很长的 div 它是由 ng hide 隐藏 显示的 这是一个基于离子的示例demo http codepen io leonz full bEqbKM 单击该按钮可以显示或隐藏 longDiv 如果您尝试在隐藏或显示页面后立即滚动
  • 如何从 pandas groupby 对象创建多个数据框

    我正在尝试在多索引数据帧 df 上使用 groupby 创建新的数据帧 级别 0 是字符串标识符 级别 1 是日期时间索引 最终我想确定每个 vsl 与每个 DIV 和 DIS 关联的总时间 这是 df 的片段 DIV DIS vsl Be
  • 派生类中的 sizeof(*this) 和 decltype(*this)

    假设有类 struct A int a virtual size t GetMemoryUsage const return sizeof this struct B public A int b 而且可能还有更深层次的传承 我想要的是有一