我的目的是实现一个大整数类。
如果我尝试为对象赋值,则必须以这种方式完成
$
而不是这样
Big_int n =1234567890123456;
答案 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)
答案 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;
}