【发布时间】:2010-08-20 08:57:15
【问题描述】:
我最近一直在进行大规模的重构,我更改了很多代码以返回布尔值,而不是显式的返回代码。为了帮助这种重构,我决定尽可能依靠编译器,让它告诉我需要更改代码的地方。我通过引入以下课程来做到这一点 (see here for the lowdown on how this works):
///
/// 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 类型所没有的额外安全级别。
然而,有一个“问题”阻止我这样做。目前我们在代码中大量使用了ternary operator,问题是它与这个没有显式转换的新类不兼容:
TypesafeBool result = ( 1 == 2 ? SomeFunction() : false ); // error: different types used
TypesafeBool result = ( 1 == 2 ? SomeFunction() : (TypesafeBool)false );
如果我可以“解决”这个问题,以便我可以无缝地使用我的课程,我可能会在整个代码库中继续使用它。有谁知道这个问题的解决方案?还是只是不可能做我想做的事?
【问题讨论】:
-
Ewww...C 风格的演员表...你的意思是
TypesafeBool(false)在你的第二行吗? -
@Dominic:这与我认为的相同(C++ 编译器将选择适当的构造函数)但我同意我更愿意看到对构造函数的显式调用。
-
@Naveen:尝试使用在侧面返回
TypesafeBool的函数调用 :) -
这也在编译:
TypesafeBool f() { return TypesafeBool(true); } int main() { TypesafeBool b = (1==1) ? f() : false; } -
@Naveen: 你用的是哪个编译器?
标签: c++ type-conversion type-safety