【发布时间】:2012-02-13 17:43:57
【问题描述】:
对于一些语法糖,我想返回一个对this的引用,但是当被继承时,函数应该返回子类的类型:
class base {
T &operator!() { return *this; }
};
base b; b = !b;
class child : public base {};
child c; c = !c;
由于操作符,我不能只返回指针和动态转换它,它必须是一个引用。
这可能吗?将decltype(*this) 用于T 不起作用,auto f()->decltype(*this) 也不起作用,因为this(虽然我不明白为什么,在自动情况下)
在 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 }
};
【问题讨论】:
-
请不要以改变其基本含义的方式覆盖运算符。这是一个非常糟糕的主意,会导致混乱和错误。
-
在这种情况下它是一个 DSL 的东西,我实际上使用 &&,即使它不返回布尔值,它在语义上的意思是“和”
标签: c++ templates crtp static-polymorphism