我想实现一种数据类型,它可以在c++中接受整数值加上一个无穷大符号

I want to implement a data type that would take integer values plus an infinity symbol in c++.

本文关键字:c++ 整数 符号 无穷大 上一个 实现 数据类型 一种      更新时间:2023-10-16

然后我想对数据类型(加法,减法等)进行正常操作。所有对无穷的运算都以自然的方式定义。例如,无穷+任意整数=无穷。

当然,我可以用一个struct结构来完成这个,然后定义所有的操作。在c++中是否有一种简洁的方法来做到这一点?

Thank You

在c++中是否有一种简洁的方法来做到这一点?

好消息是你不需要;这个问题已经在boost::date_time::int_adapter中得到解决(并进行了测试)。

我不知道为什么它在date_time中,但特定的类模板是一个适配器,用于创建具有±∞的整数类型,并且"不是数字"。

示例程序:

#include <boost/date_time/int_adapter.hpp>
#include <iostream>
int main()
{
    typedef boost::date_time::int_adapter<int> integer;
    integer const i = integer::max();
    std::cout << "i = " << i << 'n';
    std::cout << "i + 1 = " << i + 1 << 'n';
    std::cout << "Infinity looks like: " << integer::pos_infinity() << 'n';
    // So for instance , infinity + any integer = infinity.
    std::cout << "infinity + any integer = " << integer::neg_infinity() + 1 << 'n';
}

输出示例:

i = 2147483645
i + 1 = not-a-number
Infinity looks like: +infinity
infinity + any integer = -infinity

如果你定义了一个隐式转换操作符和构造函数来转换到/从包装类型(在你的情况下,我猜你的意思是int),所有的算术运算在包装值上按预期工作。像这样:

class Infinity {}; // Empty helper class, see second constructor
class MaybeInfinity {
    int value;
    bool infinity;
public:
    MaybeInfinity(int value = 0) : value(value), infinity(false) {}
    MaybeInfinity(Infinity) : value(0), infinity(true) {}
    bool isInfinity() const { return infinity; }
    const int & operator() const { return value; }
    int & operator() { return value; }
    ...
};

但是,您说您想为(某些)算术运算定义自定义行为。那么你最好重载所有算术运算符。例如,加法可以写成:

class MaybeInfinity {
    ...
    MaybeInfinity operator +(const MaybeInfinity & other) const {
        if (infinity || other.infinity) {
            return Infinity();
        }
        return value + other.value;
    }
    ...
};

注意,对于没有重载特定算术运算符的所有运算符,由于转换运算符,您的类的行为就像普通的整数运算符一样。此外,您还可以使用类和整数值进行计算,例如:

MaybeInfinity number = 3;
number += 2;
MaybeInfinity otherNumber = Infinity();
number += otherNumber;
// and so on

PS:这个类可以是模板。用T代替int,在定义前加上template<typename T>,确保你没有在.cpp文件中单独实现,然后使用像MaybeInfinity<int>这样的类型或使用其他包装类型。