[英]Optional class members without runtime overhead
我有以下非常普遍的问题,我还没有找到令人满意的解决方案:所以我想要两个基本相同的类A
和AData
,除了后者有一个额外的属性data
并且每个类都支持 function foo()
,这是不同的,因为它取决于附加数据的存在。
愚蠢的解决方案是复制整个 class 并稍微更改它,但这会导致代码重复并且难以维护。 使用 std::optional 或指针会导致额外的检查,从而导致运行时开销,对吗?
我的问题是,是否有一种方法可以获得与仅复制代码而无需实际代码复制相同的运行时性能? 我目前的解决方案是使AData
成为派生的 class 并将其声明为A
的朋友,然后覆盖虚拟 function foo()
,但由于使用了friend
,我不喜欢这种方法。
您可以使用 static 多态性和奇怪的重复模板模式。 A
和AData
都提供foo()
但行为是通过doFoo()
特定于类的。 不使用虚拟调度也避免了 vtable 查找的运行时开销。
template <typename TData>
class Abase
{
public:
void foo()
{
static_cast<TData*>(this)->doFoo();
}
};
class A : public Abase<A>
{
friend ABase<A>;
void doFoo() { cout << "A::foo()\n"; }
};
class AData : public Abase<AData>
{
friend Abase<AData>;
int someDataMember;
void doFoo() { cout << "AData::foo()\n"; /*... use someDataMember ... */}
};
为什么不使用组合:
class A
{
public:
void foo() { /*...*/ }
};
class AData
{
A a;
int someDataMember;
public:
void foo() { /*... use someDataMember ...*/ }
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.