假设有类:
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(使用前将#替换为@)