C++ 定义一个作用类似整数无穷大的对象
我创建了一个对象,它的行为有点像长整数的无穷大。具体而言:C++ 定义一个作用类似整数无穷大的对象,c++,C++,我创建了一个对象,它的行为有点像长整数的无穷大。具体而言: #ifndef MU_INF_H #define MU_INF_H #include "mu.h" namespace mu { class Inf { public: bool operator> ( long int i ) { return true; } bool operator> ( Inf i ) { return false; } ... lots of other boole
#ifndef MU_INF_H
#define MU_INF_H
#include "mu.h"
namespace mu {
class Inf {
public:
bool operator> ( long int i ) { return true; }
bool operator> ( Inf i ) { return false; }
... lots of other boolean operators ...
Inf& operator+ ( long int i ) { return *this; }
Inf& operator+ ( Inf i ) { return *this; }
... lots of other integer operators ...
}; // class Inf
} // namespace mu
#endif
这一切都非常有效,允许我运行以下形式的单元测试:
mu::Inf inf;
long int n = -1;
long int z = 0;
long int p = 1;
ASSERT((inf + inf) == inf);
ASSERT((inf + n) == inf);
ASSERT((inf + z) == inf);
ASSERT((inf + p) == inf);
ASSERT((inf > inf) == false);
ASSERT((inf > n) == true);
ASSERT((inf > z) == true);
ASSERT((inf > p) == true);
冒着无法指定复选标记的风险,我有三个问题:
- 我想在我的系统中提供一个Inf实例。我不能将它声明为
,因为它不是一个“简单”对象。什么是正确的方法:全球?单件模式李>静态常量
- 有没有一种方法可以处理长int首先出现的对称运算符,即
?(如果没有,我不会太难过。)ASSERT((1+inf)==inf)
Inf
的引用和实际对象
通常情况下,除了复合赋值运算符(通过引用返回)之外,您还可以按值或const
引用获取参数,并按值返回所有运算符,以获得预期的语义。当然,由于您的Inf对象没有状态,这一切只有在一定程度上才有意义
const
global来避免单例中的括号和潜在函数调用。这是否也是静态的
应该几乎没有区别(您没有以任何方式访问此
)
inline Inf operator+(long int i, const Inf&) { return *this;}
static const Inf kInfinity代码>工作并将使用默认构造函数
运算符+
应该是按值返回的自由函数:
Inf operator+(Inf a, Inf b) { return a += b; }
您表示希望返回对kInfinity
的引用,而不是值。这是可能的(尽管我觉得有点笨拙);当然必须返回const
引用,因为kInfinity
是const
每个人都帮我找到了真正的方向。为了帮助其他来寻找答案的人,而不是让你把整个线索的答案一针见血地拼凑在一起,我想我应该发布我最终得到的答案。当然,建议改进的评论是受欢迎的
#ifndef MU_INDEFINITE_H
#define MU_INDEFINITE_H
namespace mu {
class Indefinite {
public:
static const Indefinite kIndefinite;
Indefinite() {}
~Indefinite() {}
};
inline Indefinite operator+ (long int i, Indefinite t) { return Indefinite::kIndefinite; }
inline Indefinite operator+ (Indefinite t, long int i) { return Indefinite::kIndefinite; }
inline Indefinite operator+ (Indefinite t1, Indefinite t2) { return Indefinite::kIndefinite; }
inline Indefinite operator- (long int i, Indefinite t) { return Indefinite::kIndefinite; }
inline Indefinite operator- (Indefinite t, long int i ) { return Indefinite::kIndefinite; }
inline Indefinite operator- (Indefinite t1, Indefinite t2) { return Indefinite::kIndefinite; }
inline Indefinite operator* (long int i, Indefinite t) { return Indefinite::kIndefinite; }
inline Indefinite operator* (Indefinite t, long int i ) { return Indefinite::kIndefinite; }
inline Indefinite operator* (Indefinite t1, Indefinite t2) { return Indefinite::kIndefinite; }
// It's not clear what i / Indefinite should produce. Forbid it for now.
// inline long int operator/ (long int i, Indefinite t) { return 0; }
inline Indefinite operator/ (Indefinite t, long int i ) { return Indefinite::kIndefinite; }
inline Indefinite operator/ (Indefinite t1, Indefinite t2) { return Indefinite::kIndefinite; }
inline bool operator> (long int i, Indefinite t) { return false; }
inline bool operator> (Indefinite t, long int i) { return true; }
inline bool operator> (Indefinite t1, Indefinite t2) { return false; }
inline bool operator>= (long int i, Indefinite t) { return false; }
inline bool operator>= (Indefinite t, long int i) { return true; }
inline bool operator>= (Indefinite t1, Indefinite t2) { return true; }
inline bool operator< (long int i, Indefinite t) { return true; }
inline bool operator< (Indefinite t, long int i) { return false; }
inline bool operator< (Indefinite t1, Indefinite t2) { return false; }
inline bool operator<= (long int i, Indefinite t) { return true; }
inline bool operator<= (Indefinite t, long int i) { return false; }
inline bool operator<= (Indefinite t1, Indefinite t2) { return true; }
inline bool operator== (long int i, Indefinite t) { return false; }
inline bool operator== (Indefinite t, long int i) { return false; }
inline bool operator== (Indefinite t1, Indefinite t2) { return true; }
inline bool operator!= (long int i, Indefinite t) { return true; }
inline bool operator!= (Indefinite t, long int i) { return true; }
inline bool operator!= (Indefinite t1, Indefinite t2) { return false; }
}
#endif
#如果不确定
#定义MU__H
名称空间mu{
类不定{
公众:
静态常数不定定常数;
不定(){}
~unfinite(){}
};
内联不定运算符+(长整数i,不定t){返回不定::kIndefinite;}
内联不定运算符+(不定t,长int i){返回不定::kIndefinite;}
内联不定运算符+(不定t1,不定t2){返回不定::kIndefinite;}
内联不定运算符-(长整数i,不定t){return infinite::kIndefinite;}
内联不定运算符-(不定t,长整数i){return infinite::kIndefinite;}
内联不定运算符-(不定t1,不定t2){返回不定::kIndefinite;}
内联不定运算符*(长整数i,不定t){返回不定::kIndefinite;}
内联不定运算符*(不定t,长int i){返回不定::kIndefinite;}
内联不定运算符*(不定t1,不定t2){返回不定::kIndefinite;}
//不清楚我/我应该制作什么。暂时禁止。
//内联长整型运算符/(长整型i,不定t){返回0;}
内联不定运算符/(不定t,长int i){返回不定::kIndefinite;}
内联不定运算符/(不定t1,不定t2){返回不定::kIndefinite;}
内联布尔运算符>(长整数i,不定t){return false;}
内联布尔运算符>(不定t,长整数i){return true;}
内联布尔运算符>(不定t1,不定t2){return false;}
内联布尔运算符>=(长整数i,不定t){return false;}
内联布尔运算符>=(不定t,长整数i){返回真;}
内联布尔运算符>=(不定t1,不定t2){return true;}
内联布尔运算符<(长整数i,不定t){return true;}
内联布尔运算符<(不定t,长整数i){返回false;}
内联布尔运算符<(不定t1,不定t2){返回false;}
内联布尔运算符你是什么意思它不是一个“简单”的对象
?如果你的代码运行正常,并且你希望得到关于如何改进的建议,你可能会在codereview.stackexchange上得到更好的帮助。@BryanChen:我的意思是我不能做静态常量Inf kInfinity=new Inf()
或任何类似于使其成为静态常量的东西。要生成对称运算符,它们应该是自由函数:Inf operator+(Inf a,Inf b){return a+=b;}
。现有的运算符+
不符合运算符+
的通常语义,使用起来可能会混淆(它做了操作符+=
通常做的事情)。@fearless\u傻瓜静态常量Inf kInfinity;
注意:静态常量的初始化需要用户提供的默认构造函数。系统默认值不会将其删除。我之所以提到它,是因为OP发布的类没有构造函数。(和+1 btw)注意,如果使用SFINAE驱动的一组自由函数,OP可以覆盖比long
更多的基础。回答不错。