W
Bleibt noch zu erwähnen, wie man den Algorithmus in den ostream rein bekommt, damit die Zahlen auch ausgegeben werden. Da der 'num_put' lange nicht dran war - hier noch mal komplett:
#include <iostream>
#include <locale>
#include <cassert>
template< int Base, typename E, typename Out, typename I >
Out put_number( Out out, I x )
{
assert( x >= 0 );
const I digit = x % Base;
if( (x /= Base) != I(0) )
out = put_number< Base, E >( out, x );
*out++ = E( (digit < 10? '0': 'a' - 10) + digit );
return out;
}
template< int Base, typename E >
class UserBase : public std::num_put< E >
{
protected:
virtual iter_type do_put( iter_type out, std::ios_base& str, char_type fill, long val ) const
{
if( str.flags() & std::ios_base::basefield )
return std::num_put< E >::do_put( out, str, fill, val );
if( val < 0 )
{
*out++ = '-';
val = -val;
}
out = put_number< Base, E >( out, val );
if( out.failed() )
str.setstate( std::ios_base::failbit );
return out;
}
};
template< int Base, typename E, typename Traits >
void imbue_base( std::basic_ostream< E, Traits >& out )
{
out.imbue( std::locale( out.getloc(), new UserBase< Base, E > ) );
}
template< typename E, typename Traits >
std::basic_ostream< E, Traits >& user_base( std::basic_ostream< E, Traits >& str )
{
str.unsetf( std::ios_base::basefield );
return str;
}
int main()
{
using namespace std;
imbue_base< 7 >( cout ); // ab jetzt können Zahlen auf cout zur Basis7 ausgegeben werden
for( int i = 14; i < 36; ++i ) // Demo
cout << dec << i << " = " << user_base << i << "_sieben" << endl;
return 0;
}
Gruß
Werner