Я знаю, что basefield
является маской для dec/oct/hex
. Все, что я хочу, это отменить их с помощью функции потока setf
, но независимо от того, насколько я пытаюсь это неправильно, поэтому я написал следующий пример, чтобы помочь мне понять, как флаги внутренне ищут все возможные значения basefield
.set basefield to zero
#include <iostream>
using namespace std;
int main()
{
typedef ios_base::fmtflags fmt;
fmt a, b, c = cout.basefield;
cout << "basefield: " << hex << c << endl;
cout << dec;
a = cout.flags();
b = a & c;
cout << "\ndec flags:\n";
cout << " a: " << hex << a << endl;
cout << " b: " << hex << b << endl;
cout << oct;
a = cout.flags();
b = a & c;
cout << "\noct flags:\n";
cout << " a: " << hex << a << endl;
cout << " b: " << hex << b << endl;
cout << hex;
a = cout.flags();
b = a & c;
cout << "\nhex flags:\n";
cout << " a: " << hex << a << endl;
cout << " b: " << hex << b << endl;
cout.setf(cout.flags() & ~cout.basefield);
a = cout.flags();
b = a & c;
cout << "\nunset basefiled:\n";
cout << " a: " << hex << a << endl;
cout << " b: " << hex << b << endl;
}
г ++ 4.8.1 Результатов:
basefield: 4a
dec flags:
a: 1002
b: 2
oct flags:
a: 1040
b: 40
hex flags:
a: 1008
b: 8
unset basefiled:
a: 1008
b: 8
Если не установлено все основания флагов значение устанавливается таким же, как шестигранные флаги, поэтому я запускаю код Visual C++ 2008 и Intel C++ XE и тому Результат был:
basefield: e00
dec flags:
a: 201
b: 200
oct flags:
a: 401
b: 400
hex flags:
a: 801
b: 800
unset basefiled:
a: 801
b: 800
Хед-флаги, кажется, точны, когда все основания не установлены.
Все, что я хочу, это установить флаги в значение, отличное от dec\oct\hex
, поэтому, когда я реализую свой собственный манипулятор, я могу определить, какой формат используется в моих форматах или форматах потоков.
Спасибо.
Это не способ создания собственных манипуляторов. –
Я хочу создать манипулятор 'bin', есть ли лучший способ сделать это? –
Нет, это невозможно. Вам нужно будет создать новый манипулятор. Возможно, вы должны задать новый вопрос. –