Я создал объект, который действует как бесконечность для длинных int. В частности:
#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 доступным в моей системе. Я не могу объявить его
static const
, потому что это не "простой" объект. Какой правильный подход: глобальный? одноэлементный шаблон? - Есть ли способ обрабатывать симметричные операторы, где первый int приходит первым, т.е.
ASSERT((1 + inf) == inf)
? (Я не буду слишком грустен, если нет.)