2017-03-20 66 views
2

我想重載一個函數來檢查struct對象是否爲空。如何重載struct的空操作符?

這裏是我的結構定義:

struct Bit128 { 
    unsigned __int64 H64; 
    unsigned __int64 L64; 

    bool operate(what should be here?)(const Bit128 other) { 
     return H64 > 0 || L64 > 0; 
    } 
} 

這是測試代碼:

Bit128 bit128; 
bit128.H64 = 0; 
bit128.L64 = 0; 
if (bit128) 
    // error 
bit128.L64 = 1 
if (!bit128) 
    // error 
+2

查找'運營商布爾()'。作爲一個沒有參數的成員函數。 – Peter

+2

[c]結構中沒有方法,否則請從現在開始標記你的問題,謝謝。 –

回答

3
#include <cstdint> 
struct Bit128 
{ 
    std::uint64_t H64; 
    std::uint64_t L64; 
    explicit operator bool() const { 
     return H64 > 0u || L64 > 0u; 
    } 
}; 
+0

這應該是['顯式運算符布爾()'](http://stackoverflow.com/q/6242768/7571258),除非OP沒有C++ 11可用,在這種情況下,'安全布爾'成語應該是使用,例如, G。其中一個[boost實現](http://stackoverflow.com/a/11854479/7571258)。 – zett42

+0

@ zett42:會更安全,是的。 – Pixelchemist

3

你想重載bool操作:

explicit operator bool() const { 
// ... 

該運營商不具備是,但應該是,const方法。

+0

爲什麼'顯式'如果OP的用例有一個隱式轉換需要? – AndyG

+1

@AndyG因爲'顯式操作符bool'可以用在可以[上下文轉換爲bool]的地方(http://stackoverflow.com/a/39995574/7571258)。這比隱式轉換更具限制性,所以它應該是聲明'operator bool'的默認方式。 – zett42

+0

@ zett42:我明白了。謝謝! – AndyG

1

有沒有「空」操作,但如果你希望對象在布爾環境(如if條件),你想重載布爾轉換運營商的意義:

explicit operator bool() const { 
    return H64 != 0 || L64 != 0; 
} 

注意顯式轉換運算符需要C++ 11。在此之前,您可以使用非顯式操作符,但它有許多缺點。相反,你會想要谷歌的安全布爾成語。