Всем привет!
Начал вот писать класс для работы с командной строкой.
За основу взял boost::program_options.
Есть у меня в программе строковые и булевые опции.
Для их хранения предусмотрены ассоциативные массивы.
Только вот не хочу я делать методы типа
GetStringOption, GetBoolOption и т.д.
Хочется написать что-то вроде шаблонного метода, приведённого
ниже, а потом вызывать:
CmdLine C(argc,argv);
const std::string s("disable_stderr");
bool b = C.GetOpt(s);
const std::string ss("cfg_f_name");
std::string name = C.GetOpt(ss);
Правда вот для C++ подобные фокусы неправильны.
Как я понимаю без явной специализации не обойтись:
bool b = C.GetOpt<bool>(s);
std::string name = C.GetOpt<std::string>(ss);
Вообщем задача понятна : вызывать нужный метод в зависимости от
типа значения слева без явного указания этого типа.
Как это реализовать в C++?
Кусочек класса приведён ниже
/*
\class CmdLine
\brief Class for encapsulate all command line operations
*/
class CmdLine
{
public:
/// Constructor
CmdLine(int argc, char** argv);
/// Destructor
~CmdLine();
template <class T>
T GetOpt(const std::string& OptionName) const
{
// Do anything
}
private:
/// Map for string options, e.g. Script File Name
std::map<std::string,std::string> StringOptions_;
/// Map for string options, e.g. Disable StdErr Output
std::map<std::string,bool> BoolOptions_;
/// Options Description
po::options_description Description_;
};