gpt4 book ai didi

c++ - 在 C++11 中对派生类使用基类运算符

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:57 25 4
gpt4 key购买 nike

考虑这个例子。

我有一个容器类 ( A ),它重载/实现了各种算术运算符 ( A::negate() )。

我现在希望创建派生类(BC)。

BC应该由 A 实现所有运营商.

但是,这些运算符应该使用派生类对象作为参数。

B::negate 的原型(prototype)应该是:B B::negate() , 而不是 A B::negate() .

派生类不需要任何自己的字段,但可以实现自己的方法(B::foo()C::bar())。要求 BC不兼容,即 B对象不能分配给 C对象,或与 C 中的任何一项一起使用的运营商。

这是示例代码,我希望它如何工作:

struct A {
int val;

A negate() {
return A{-val};
}
};

struct B: A {void foo(){}};
struct C: A {void bar(){}};

int main() {
B obj0 = {5};
B obj1 = obj0.negate();
}

我知道使用标准继承这可能是不可能的,并且可能是 C++11 根本无法做到的,所以我要求尽可能接近它的东西。

目前我想出的最佳解决方案是根本不使用继承,而是向基类添加一个整数模板参数,将派生类定义为using B = A<1>;。 , using C = A<2>; , 并仅为某些特化实现成员方法(仅 A::foo<1>(){}A::bar<2>(){} )。

但是,我对这个解决方案非常不满意。

最佳答案

template<typename Child>
struct A {
Child* self() {
static_assert( std::is_base_of< A<Child>, Child >::value, "CRTP failure" );
return static_cast<Child*>(this);
}
Child const* self() const {
static_assert( std::is_base_of< A<Child>, Child >::value, "CRTP failure" );
return static_cast<Child const*>(this);
}
Child negate() {
return Child{-val};
}
};
struct B:A<B> {
explicit B(int v):A<B>(v) {}
};

在这里,我们将信息注入(inject)基类template关于它的 child 。 B然后就比较自由的当普通类了。

在parent中,可以得到self()为了访问您的 this指针作为 B (或其他派生类)。

另一种方法涉及自由函数。你写一个免费negate template检查其参数是否派生自 A 的函数,如果是,则执行否定操作,并返回传入类型的否定版本。

这些的混合也有效,你的自由函数需要 A<D> s 并返回 D .

关于c++ - 在 C++11 中对派生类使用基类运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19987224/

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