This HowTo guides you through satisfying the requirements of sharg::parsable .
Difficulty Easy
Duration 10 min
Prerequisite tutorials
Recommended reading
Motivation
To use a custom type with sharg::parser::add_option
or sharg::parser::add_positional_option
, the type must satisfy sharg::parsable
. This tutorial shows you what requirements must be met and supplies you with a copy and paste source for your code.
Concept sharg::parsable
As you can see in the API documentation of sharg::parsable
, the type must model either both sharg::istreamable
and sharg::ostreamable
or sharg::named_enumeration
.
If your type is an enum, refer to sharg::enumeration_names
on how to make it compatible with the sharg::parser
.
In all other cases, your type needs to model sharg::istreamable
and sharg::ostreamable
. As you can see in the respective documentation, the concept is simple. You merely need to supply the stream operators operator>>()
and operator<<()
for your type.
Make your own type compatible
Note You must be able to modify the class itself for this solution to work.
The following example makes the class bar
in namespace foo
compatible with the sharg::parser
:
namespace foo
{
class bar
{
public :
int a;
{
output << my_bar.a;
return output;
}
{
input >> my_bar.a;
return input;
}
};
}
int main(int argc, char const ** argv)
{
foo::bar my_bar{};
try
{
parser.parse();
}
{
return -1;
}
return 0;
}
Meta-header for the Parser module .
Parser exception that is thrown whenever there is an error while parsing the command line arguments.
Definition exceptions.hpp:40
The Sharg command line parser.
Definition parser.hpp:154
void add_option(option_type &value, config< validator_type > const &config)
Adds an option to the sharg::parser.
Definition parser.hpp:241
@ off
Automatic update notifications should be disabled.
Option struct that is passed to the sharg::parser::add_option() function.
Definition config.hpp:43
char short_id
The short identifier for the option (e.g. 'a', making the option callable via -a).
Definition config.hpp:53
Make an external type compatible
If you cannot modify the class, you can do the following:
namespace external
{
class bar
{
public :
int a;
};
}
{
ostream & operator<<(ostream &
output , external::bar
const &
ext_bar )
{
}
istream & operator>>(istream &
input , external::bar &
ext_bar )
{
}
}
int main(int argc, char const ** argv)
{
external::bar ext_bar{};
try
{
parser.parse();
}
{
return -1;
}
return 0;
}