Недавно я провел огромный рефакторинг, в котором я изменял большую часть своего кода, чтобы он возвращал логические значения вместо явного кода возврата.Чтобы помочь этому рефакторингу, я решил опираться на компилятор, где это возможно, чтобы он сообщал мне места, где мой код нужно было изменить.Я сделал это, введя следующий класс ( см. Здесь о том, как это работает): :
///
/// Typesafe boolean class
///
class TypesafeBool
{
private:
bool m_bValue;
struct Bool_ {
int m_nValue;
};
typedef int Bool_::* bool_;
inline bool_ True() const { return &Bool_::m_nValue; }
inline bool_ False() const { return 0; }
public:
TypesafeBool( const bool bValue ) : m_bValue( bValue ){}
operator bool_() const { return m_bValue ? True() : False(); }
};
Теперь вместо использования обычного типа bool
в качестве возвращаемого типаЯ использовал этот класс, что означало, что я больше не мог скомпилировать что-то вроде этого:
TypesafeBool SomeFunction();
long result = SomeFunction(); // error
Отлично: он сделал управление рефакторингом на огромной кодовой базе, позволив компилятору выполнять большую часть сложных задачработать на меня.Итак, теперь я закончил рефакторинг, и мне бы очень хотелось, чтобы этот класс зависал и продолжал использовать его, поскольку он дает нам дополнительный уровень безопасности, которого не имеет встроенный тип bool
.
Однако есть одна «проблема», которая мешает мне сделать это.В настоящее время мы интенсивно используем троичный оператор в нашем коде, и проблема в том, что он не совместим с этим новым классом без явных приведений:
TypesafeBool result = ( 1 == 2 ? SomeFunction() : false ); // error: different types used
TypesafeBool result = ( 1 == 2 ? SomeFunction() : (TypesafeBool)false );
Если бы я мог«решить» эту проблему, чтобы я мог беспрепятственно использовать свой класс, и, вероятно, продолжал бы использовать его в кодовой базе.Кто-нибудь знает решение этой проблемы?Или просто невозможно делать то, что я хочу?