gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:47:40 26 4
gpt4 key购买 nike

假设有类:

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);
}

You can also implement a hierarchy of interfaces incrementally easily using this idiom.

关于c++ - 派生类中的 sizeof(*this) 和 decltype(*this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50294936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com