c++ - 派生类中的 sizeof(*this) 和 decltype(*this)
问题描述
假设有类:
struct A {
int a;
virtual size_t GetMemoryUsage() const {
return sizeof(*this);
}
};
struct B : public A {
int b;
};
而且可能还有更深层次的传承。
GetMemoryUsage()
在这种情况下,我想要的是有一个方法可以返回对象在内存中占用的字节数。通常可以通过使用来实现sizeof(*this)
。问题是(至少 AFAIU)我必须重写每个派生类中的方法并实际复制粘贴它的主体。我不喜欢重复的代码:)
我对么?如何通过仅从基类的方法调用子类来制作sizeof(*this)
和返回我想要的子类?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)...));
}
用法:
void f(A& a) {
auto object_size = a.GetMemoryUsage();
}
int main() {
auto b = create<B>();
f(*b);
}
推荐阅读
- docker - 构建没有端口 80 出口的基于 Debian 的 docker 镜像
- html - 带有 HTML 和 CSS 的多级悬停导航栏
- google-kubernetes-engine - 对集群间连接进行故障排除
- flutter - 如何在 Flutter 中同时实现 device_preview 和 responsive_framework 包
- c - 在递归函数中使用 putchar() 反转句子
- selenium - 我对 chrome headless 有疑问。它没有加载网页页面(嵌入网页的桌面应用程序)
- javascript - 来自 jQuery 的 ERR_CERT_COMMON_NAME_INVALID 使用反向代理
- javascript - 在给定百分比的情况下滚动到网页上的特定点
- python - 使用 jsonpath-ng 在 Python 中使用上下文更新 json 数据
- java - 使用 x-csrf-token 身份验证连接到 REST Web 服务时出错