gpt4 book ai didi

c++ - 返回对此的引用和继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:19 27 4
gpt4 key购买 nike

对于一些语法糖,我想返回对this的引用,但是当被继承时,该函数应该返回子类的类型:

class base {
T &operator!() { return *this; }
};
base b; b = !b;

class child : public base {};
child c; c = !c;

因为运算符,我不能只返回指针并对其进行 dynamic_cast,它必须是一个引用。

这可能吗?对 T 使用 decltype(*this) 不起作用,auto f()->decltype(*this) 也不起作用,因为 this(虽然我不明白为什么,在 auto-case 中)

在 Scala 中你可以这样写:

template<typename T> class base {
T &f() { return *this; }
};
class child : public base<child> {};

但我的 g++ 不会接受这个(不确定这是错误还是不在规范中?)

当然有明确的方式,但我想知道是否可以使用 C++11 功能避免这种情况?

class child : public base {
child &operator!() { base::operator!(); return *this }
};

最佳答案

如果您被允许制作 base,您可以使用 CRTP 来执行此操作一个模板:

template <typename Derived> class Base {
protected:
Derived& refToThis() {
return *static_cast<Derived*>(this);
}
};

注意这里的额外类型转换。这样做的原因是如果你有这样一个类:

class Subclass: public Base<Subclass> {
/* ... */
};

然后如果你调用refToThis从该类内部,它将调用基类版本。由于该类继承自 Base<Subclass> , refToThis 的实例化模板将是

    Subclass& refToThis() {
return *static_cast<Subclass*>(this);
}

此代码是安全的,因为 this指针确实指向 Subclass目的。此外,static_cast如果派生类不从 Base 继承,将确保转换在编译时失败正确,因为指针类型不可转换。

这里需要强制转换的原因是如果你只是说

template <typename Derived> class Base {
protected:
Derived& refToThis() {
return *this;
}
};

然后程序中出现类型错误,因为 Base本身不是 Derived , 如果你能转换 Base&进入Derived&如果不进行任何检查,您可能会破坏类型系统。

也就是说……我根本不会这样做。重载operator!为此目的使代码的可读性降低,只写 *this太惯用以至于隐藏它会使您的代码更难理解。使用所有这些模板机制来避免一些常见的 C++ 似乎被误导了。如果您在返回引用之前执行其他操作,那很好,但这似乎不是一个好主意。

希望这对您有所帮助!

关于c++ - 返回对此的引用和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265256/

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