是否有可能在C ++中重载“”?

时间:2016-01-04 13:36:41

标签: c++ operator-overloading

我的目的是实现一个大整数类。

如果我尝试为对象赋值,则必须以这种方式完成

$

而不是这样

Big_int n =1234567890123456;      

3 个答案:

答案 0 :(得分:5)

最好为此使用用户定义的文字。从C ++ 11开始,它们在C ++中可用。要接受任意长的数字序列,您需要使用接受const char*的文字函数。

以下代码为您提供了用户定义的文字所需的草稿:

#include <iostream>
#include <string>

class BigInt {
 const std::string str;
 BigInt(const std::string& s) : str(s) { }
 friend BigInt operator "" _bi(const char* s);
 friend std::ostream& operator<<(std::ostream& os, const BigInt& bi);
};

BigInt operator "" _bi(const char* s) {
 return BigInt(s);
}

std::ostream& operator<<(std::ostream& os, const BigInt& bi) {
 return os << bi.str;
}

int main() {
 BigInt bi1 = 123_bi;
 BigInt bi2 = 123123412345123456123456712345678_bi;
 //BigInt bi3 = std::string("123");
 std::cout << bi1 << ' ' << bi2;
 return 0;
}

文字运算符函数operator ""接受字符串文字。我使它成为BigInt类的朋友,因此接受字符串的构造函数不适用于您的类的用户 - 但您可以使用带有_bi后缀的数字序列。唯一的缺点是带有const char*参数的文字运算符函数是整数和浮点文字的回退函数,所以仍然可以使用像

这样的东西
BigInt bi = 123.45_bi;

要阻止它,您可以声明其他

class Dummy {};
Dummy operator "" _bi(long double d) {
 return Dummy();
}

如果您的BigInt类无法使用Dummy进行初始化,如果您尝试将BigInt与浮点_bi文字一起使用,则会出现编译时错误。

答案 1 :(得分:2)

您需要添加suffix

C ++不允许自定义解析规则,因此除非还添加了(可能是自定义的)后缀,否则无法处理非常大的数字。

如果数字对于标准整数的精度而言太多,则无法说“使用此类”。

答案 2 :(得分:1)

这是我如何解决这个问题的开始。

c ++ 14&#39; constexpr意味着所有操作都可以在编译时完成,因此没有性能成本来支付(相当好的)可读性。

#include <iostream>
#include <cmath>
#include <cassert>

struct big_int {

    constexpr big_int(int x = 0) {}

    constexpr big_int(std::initializer_list<int> il)
    : big_int(0)
    {
        for (int i : il) {
            assert(i < 1000);
            assert(i >= 0);
            (*this) *= 1000;
            (*this) += i;
        }
    }


    // todo - add implementation here
    constexpr big_int& operator*=(int i) { return *this; }
    constexpr big_int& operator+=(int i) { return *this; }

    // todo - data structure here

};

int main()
{
    using namespace std;

    auto bi = big_int({123, 456, 789,  98, 765, 654}); // care: missing leading zero!

    return 0;
}