Search⌘ K
AI Features

User-defined Manipulators

Explore how to implement user-defined manipulators in C++ such as tab for tab spacing and roman for converting Roman numeral strings to decimal values. Understand the mechanisms behind manipulators, function pointers, and operator overloading to enhance output stream formatting and handling.

We'll cover the following...

Problem

Write a program to create two user-defined manipulators called tab and roman. The tab manipulator should output a \t to the output stream and the roman manipulator should receive a roman string as an argument and send its decimal equivalent to the output stream.

Coding solution

Here is a solution to the problem above.

C++
// User-defined manipulators
#include <iostream>
std :: ostream& tab ( std :: ostream& o )
{
return o << "\t" ;
}
class roman
{
private :
std :: string str ;
public :
roman ( std :: string s )
{
str = s ;
}
friend std :: ostream& operator << ( std :: ostream&, const roman& ) ;
} ;
std :: ostream& operator << ( std :: ostream& o, const roman& r )
{
struct key
{
char ch ;
int val ;
} ;
key z[ ] = {
{'m', 1000},
{'d', 500},
{'c', 100},
{'l', 50},
{'x', 10},
{'v', 5},
{'i', 1}
} ;
int num = 0 ;
int prev ;
int sz = sizeof ( z ) / sizeof ( z[ 0 ] ) ;
for ( int i = 0 ; i < r.str.length ( ) ; i++ )
{
int j ;
for ( j = 0 ; j < sz ; j++ )
{
if ( z[ j ].ch == r.str[ i ] )
{
break ;
}
}
num = num + z[ j ].val ;
if ( i != 0 && prev < z[ j ].val )
num = num - 2 * prev ;
prev = z[ j ].val ;
}
o << num ;
return o ;
}
int main( )
{
std :: string str1 = "viii" ;
std :: string str2 = "mcmxcviii" ;
std :: cout << "Roman: " << str1 << tab << "Dec: " << roman ( str1 ) << std :: endl;
std :: cout << "Roman: " << str2 << tab << "Dec: " << roman ( str2 ) << std :: endl;
return 0 ;
}

Explanation

To understand how to develop a zero-argument manipulator we need to understand the internal working of some existing manipulator, say endl. endl is simply a function that takes as its argument an ostream reference. The ...