爲了支持沒有explicit
關鍵字的編譯器(例如MSVC 2012),我必須實現安全的bool慣用法。應該對bool進行檢查的類正在建模一個指向許多類的指針,因此它應該可以轉換爲這些指針。下面的代碼描述了一個思路:如果我們使用基於explicit operator bool()
執行一切正常安全bool多次轉換歧義
// Uncomment this line to change implementation to 'safe bool'
// #define _COMPILER_NO_EXPLICIT
#if !defined(_COMPILER_NO_EXPLICIT)
#define OPERATOR_BOOL_MYTYPE(...)
#define OPERATOR_BOOL_IMPLEMENTATION(...) \
public: \
explicit operator bool() const noexcept \
{ \
return __VA_ARGS__; \
}
#else
#define OPERATOR_BOOL_MYTYPE(...) \
private: \
void safe_bool() {}; \
typedef __VA_ARGS__ safe_bool_my_type_t; \
typedef void (safe_bool_my_type_t::*safe_bool_t)()
#define OPERATOR_BOOL_IMPLEMENTATION(...) \
public: \
operator safe_bool_t() const noexcept \
{ \
return __VA_ARGS__ ? \
&safe_bool_my_type_t::safe_bool : \
nullptr; \
}
#endif
class Convertible
{
public:
operator int*() const
{ return nullptr; }
operator double*() const
{ return nullptr; }
OPERATOR_BOOL_MYTYPE(Convertible);
OPERATOR_BOOL_IMPLEMENTATION(false);
};
int main(void)
{
Convertible a;
if (a)
{
// this 'if' statement introduces compilation error
// in 'safe bool' implementation
}
return 0;
}
。問題實際上是在基於「安全布爾」的實現中的模糊可轉換性。它應該如何解決?
注意:考慮布爾轉換實現獨立於其他指針轉換實現。如果不可能給我一個線索如何在相關情況下實現它,例如如果Convertible
的計算結果爲true,如果其他轉換運算符之一正在返回非空值。
UPD:我相信有一種方法可以使一個隱式轉換比所有其他更優先。
您是否考慮使用http://www.boost.org/doc/libs/master/libs/core/doc/html/core/explicit_operator_bool.html? – erenon
是的,我回顧了升壓代碼。它實際上以相同的方式做事情,因此遭受同樣的問題:( – svv