2012-03-28 2 views
5

Я пытаюсь написать оператор BOOL-преобразования для станда :: 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 это ничего не говорит о операторов преобразования (только =, ->, [],())

Итак, можно ли как-то написать «Конверсия станд :: BitSet к BOOL оператор?»

(я не могу назвать b.any() в моем случае-заявления, так как тот же код должен работать при станд :: BitSet заменяется без знака или что-то

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

так идеальный синтаксис будет как:

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

)

Если перегрузка не представляется возможным, что рекомендуемый обходной путь?

до сих пор я использую его как:

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

, но я не люблю его.

Спасибо

+0

Это интересный вопрос. Я не знаю, какой прямой способ сделать то, что вы предлагаете. Их может не быть. Как вы знаете, проблема в том, что ни тип, ни преобразованный тип, ни преобразованный тип не определяются пользователем. Компилятор не хочет добавлять новые, подразумеваемые преобразования между типами, которые вы не создали. Возможно, вам придется определять и явно вызывать свою собственную функцию * make_bool(). * По крайней мере, если вы * встроите * свою функцию, она должна быть такой же эффективной во время выполнения, как встроенное преобразование; но вы не получите неявное преобразование, не так ли? – thb

ответ

6

Как сказано в сообщении об ошибке, оператор преобразования должно быть нестатической члена класса. Это правда.

Я не могу вызвать b.any() в своих if-statement, потому что тот же код должен запускаться, когда 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

Я пробовал делать это со специализацией, когда мне было нужно перегружать. Это кажется прекрасным. –

+0

@MarkB: Да, я видел, что вы делали частичную специализацию шаблона функции, которая не допускается. – Nawaz

+2

@ Наваз большое спасибо, это лучшее обходное решение. Я даже могу назвать это как 'if ((to_bool) (что угодно)), чтобы получить больше впечатлений от кастинга :) еще раз спасибо – relaxxx

5

§12.3.2/1: "A member Функция класса 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 вы используете (ctors, уступки и т.д.)

+0

Спасибо, ваш ответ определенно правильный, но я пойду с решением Nawaz. Ваше решение «много работает», но это даст мне синтаксис, который я хотел. Еще раз спасибо – relaxxx

2

стандарт немного неясно, на этом (12.3.2):

A Функция-член класса X, не имеющая параметров с именем формы [...], указывает преобразование из X в тип, указанный идентификатором типа преобразования. Такие функции называются функциями преобразования. Нельзя указать тип возврата. Если функция преобразования является функцией-членом, тип функции преобразования (8.3.5) - это «функция, не возвращающая параметр, возвращающий идентификатор типа преобразования».

Первое предложение подразумевает, что только функции-члены могут быть функциями преобразования, но я не уверен, что цель условной «если функция преобразования является функцией членом» есть.

Я бы взял первое предложение как обязательное условие и пришел к выводу, что функция преобразования должна быть функцией-членом.

Смежные вопросы