gpt4 book ai didi

c++ - 是否可以完全模拟虚拟运算符++(int)?

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:43 24 4
gpt4 key购买 nike

我们无法制作operator++(int) virtual直接是因为返回类型的问题。通常的建议是应用奇怪命名的 Curiously Recurring Template Pattern ,我尽我所能实现如下:

// abstract numeric type
template <typename T>
class A {
public:
virtual T& operator++() = 0;
virtual T get() const = 0;
virtual string toString() const = 0;
virtual T operator++(int) {
T old(this->get());
++*this; // calls operator++() from derived class
return old;
}
friend ostream& operator<<(ostream& os, const A& a) {
return os << a.toString();
}
virtual ~A() = 0;
};

// signed numeric type
class S : public A<S> {
public:
S(long l) : m_l(l) {}
virtual S get() const { return m_l; }
virtual string toString() const { return to_string(m_l); }
virtual S& operator++() { // no wrapping, caps at LONG_MAX
if (m_l < LONG_MAX)
++m_l;
return *this;
}
private:
long m_l;
};

// unsigned numeric type
class U : public A<U> {
public:
U(unsigned long ul) : m_ul(ul) {}
virtual U get() const { return m_ul; }
virtual string toString() const { return to_string(m_ul); }
virtual U& operator++() { // no wrapping, caps at ULONG_MAX
if (m_ul < ULONG_MAX)
++m_ul;
return *this;
}
private:
unsigned long m_ul;
};

很多代码重复,但至少它允许像下面这样的构造运行,这绝对是一个开始:

template <typename T>
void pinc(A<T>& a) {
cout << a++ << ' ' << a << endl;
}

int main() {
S s(LONG_MAX);
pinc(s);

U u(LONG_MAX);
pinc(u);

return 0;
}

遗憾的是,它对 vector<A*> 这样的事情没有帮助。 : SU没有共同的祖先。如果我导出 A从另一个基类,我还必须将模板化部分移到那里,问题 - 哈! - 递归。

那么,有什么建议吗?

编者注:吸取教训,这次我保留了原文。 :)

最佳答案

我认为这在 C++ 类型系统中是不可能的,原因如下:

考虑以下示例:假设我们以某种方式实现了这一点,并且有 A* a 指针指向 US 的基类被派生。那么 var = (*a)++; 的类型是什么?它可以是 US,具体取决于 a 指向的内容。但是编译器在编译期间需要知道返回类型,因为 operator++(int) 按值返回 SU

我看到以下解决此问题的方法,但它们都需要更改层次结构中 operator++(int) 的返回类型以使它们协变(参见 C++ virtual function return type):

  1. 返回层次结构中(基)类的指针

  2. 如果你的类型是整数类型(比如 operator++ return char, int, long 用于不同的类)那么你可以它们都返回封闭类型:long int

  3. 不是返回对象的直接值(US),而是返回某种能够容纳任何 这些类型。 (请参阅 http://www.boost.org/doc/libs/1_61_0/doc/html/any.html 了解可能的通用方法)

关于c++ - 是否可以完全模拟虚拟运算符++(int)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40933100/

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