2012-03-28 52 views
5

我想寫性病布爾轉換操作符:: bitset的超載非會員轉換爲BOOL操作

我想:

template<size_t size> 
operator bool(std::bitset<size> & b) 
{ 
    return b.any(); 
} 

,但我從拿到

error C2801: 'mynamespace::operator bool' must be a non-static member 

我的視覺工作室。

但是,當我擡頭C2801 explanation它說,關於轉換操作符沒有(僅約=, - > [],())

因此,是否有可能以某種方式寫「轉化的std :: bitset的爲bool運營商?」

(我不能叫b.any()在我的if語句,因爲相同的代碼必須運行時的std :: bitset的替換籤名或東西

typedef std::bitset<x> Bitset; 
//typedef unsigned Bitset; 

所以理想的語法會像:

Bitset b = whatewer; 
if(b) 
    doStuff(); 

如果超載是不可能的,什麼是推薦的解決辦法?

到目前爲止,我使用它像:

if(b == Bitset(0)) 
    doStuff(); 

,但我不喜歡它。

謝謝

+0

這是一個有趣的問題。我不知道有什麼直接的方式去做你的建議。可能不存在一個。如你所知,麻煩的是從轉換的類型和轉換爲的類型都不是用戶定義的。編譯器不希望讓您在未創建的類型之間添加新的implict轉換。您可能必須定義並顯式調用您自己的函數* make_bool()。*至少如果您內嵌函數,它應該在運行時與內置轉換一樣高效;但你不會得到隱式轉換,對嗎? – thb 2012-03-28 18:56:55

回答

6

隨着錯誤消息指出,轉換操作符必須是類的非靜態成員。那是真實的。

我不能在我的if語句中調用b.any(),因爲當std :: bitset被unsigned或其他東西替換時,必須運行相同的代碼。

如果這是你的問題,那麼你可以使用函數重載,並把它傳遞將返回一個布爾值參數:

template<typename T> 
bool to_bool(T const & b) 
{ 
    return b; //implicit conversion (if allowed) for all other types 
} 

template<size_t N> 
bool to_bool(std::bitset<N> const & b) 
{ 
    return b.any(); 
} 

然後用它作爲:

if (to_bool(whatever)) 
{ 
} 

它會調用正確的過載。如果whatever的類型是std::bitset<N>那麼第二個重載函數將被調用,否則第一個將被調用。 「

+1

當我需要的所有東西都是過載的時候,我試着用專業化來做這件事。這看起來很好。 – 2012-03-28 19:12:31

+0

@MarkB:是的,我看到你正在做功能模板的部分專業化,這是不允許的。 – Nawaz 2012-03-28 19:13:57

+2

@Nawaz非常感謝你,這是最好的解決方法。我甚至可以稱它爲'if((to_bool)(whatever))'以獲得更多的演員印象:)再次感謝你 – relaxxx 2012-03-28 19:17:09

5

§12.3.2/ 1:」A 成員具有名稱爲形式[...]的類X的函數指定從X到指定類型的轉換...「(C++ 11使用相同的節號和幾乎相同的措辭,僅添加該功能不帶參數)。

定義轉換的其他可能方法是一個構造函數(§12.3.1),它顯然也是一個類成員。

總之,是的,轉換必須始終定義爲成員函數。

一種方式做你想要將寫身邊std::bitset,提供您所關心的轉換包裝內容:

template <int size> 
class mybitest { 
    std::bitset<size> bits; 
public: 
    operator bool() { return bits.any(); } 
} 

但是,如果你決定要做到這一點,你需要寫轉發功能基本上所有的bitset的作品,你正在使用(構建函數,賦值等)

+0

謝謝,你的回答絕對正確,但我會用Nawaz解決方案。你的解決方案「很多工作」,但它會給我我想要的語法。再一次,謝謝你 – relaxxx 2012-03-28 19:19:43

2

的標準是在這個有點不清楚(12.3.2):

A 類別X的成員函數沒有參數,表單名稱[...]指定從X轉換爲由conversion-type-id指定的類型。這些功能被稱爲轉換功能。不能指定返回類型。 如果轉換函數是成員函數,則轉換函數(8.3.5)的類型是「不帶參數返回轉換類型標識的函數」。

第一句似乎暗示只有成員函數可以轉換函數,但我不知道是什麼目的有條件的「如果轉換函數是一個成員函數」是。

我想把第一句作爲綁定,並得出結論:轉換函數必須是成員函數。