This chapter demonstrates how to read a class defined by the programmer at the command line.
A istream& operator >>(istream&, T&) is required for any class T to be read
from the command line.
Imagine a class Attribute consisting of a key and a value - both of type string. The user should be able to enter them at the command line like:
% sample_prog -A myKey=myValue
All you have to do is to implement the class Attribute including an
istream& operator >>(istream&, Attribute&). Then you call
CmdLine::GetSingleValue giving the appropiate command line option string
and a reference to an object of class Attribute. That's all.
A complete example looks like this:
#include <iostream>
#include <string>
#include "cmdline.h"
using namespace std;
using namespace cmdl; // defined in cmdline.h
//
// define a class
//
class Attribute
{
public:
Attribute(const char* szKey="", const char* szValue="")
: m_strKey(szKey), m_strVal(szValue) { /* empty */ };
const char* getKey() const { return m_strKey.c_str(); }
const char* getVal() const { return m_strVal.c_str(); }
void setKey(const char* szKey){ m_strKey = szKey; }
void setVal(const char* szVal){ m_strVal = szVal; }
private:
std::string m_strKey;
std::string m_strVal;
};
//
// print an object to the screen (not needed for command line parameter evaluation)
//
ostream& operator <<(ostream& o, const Attribute & attr)
{
o << "(key: \"" << attr.getKey() << "\" / value: \"" << attr.getVal() << "\")";
return o;
}
//
// user defined operator >> - required by the cmdl-libary
//
istream& operator >>(istream& i, Attribute& attr)
{
string strBuffer;
i >> strBuffer;
// key and value are seperated by a '='
size_t pos = strBuffer.find('=');
if (pos == string::npos)
{ // no '=' => error
i.clear( ios::failbit ); // this causes a CmdLineException to be thrown,
// see the chapter about error handling.
}
else
{ // seperate the string at the '='
attr.setKey( strBuffer.substr( 0, pos ).c_str() );
attr.setVal( strBuffer.substr( ++pos, string::npos ).c_str() );
}
return i;
}
//
// test it
//
int main(int argc, char* argv[])
{
CmdLine C;
C.Init( --check_argc, ++check_argv); // skip program name.
// set a user defined type
Attribute attr;
if (C.GetSingleValue("-A", attr))
cout << "Attribute (user type) set: " << attr << endl;
// check if every option given was used. Unused options are unknown options!
C.Done();
return 0;
}