实现类似gflage功能,能够定义flage,并通过main参数传入flage
待实现:cmdparser.h,解析main入参为kv形式;
parser.h
#pragma once
#include <map>
#include <iostream>
#include <string>
#include "cmdparser.h"
int RegisterKey(const std::string& key_str, int* var_ptr, int default_value);
std::string RegisterKey(const std::string& key_str, std::string* var_ptr, const std::string& default_value);
#define DEFINE_i32(key, default_value) int flage_##key = RegisterKey(#key, &flage_##key, default_value)
#define DEFINE_str(key, default_value) std::string flage_##key = RegisterKey(#key, &flage_##key, default_value)
void ParseCmdFlags(CLP cmd);
parser.cpp
#include "parser.h"
class Flags {
public:
static Flags& Instance();
private:
Flags() = default;
~Flags() = default;
public:
std::map<std::string, int*> sflage_keys_i32;
std::map<std::string, std::string*> sflage_keys_str;
};
Flags& Flags::Instance() {
static Flags ins;
return ins;
}
void ParseCmdFlags(CLP cmd) {
#define Cout(key, value) std::cout << key << ":" << value << std::endl;
for (auto& item : Flags::Instance().sflage_keys_i32) {
if (cmd.hasValue(item.first)) {
*(item.second) = cmd.get<int>(item.first);
}
Cout(item.first, *item.second);
}
for (auto& item : Flags::Instance().sflage_keys_str) {
if (cmd.hasValue(item.first)) {
*(item.second) = cmd.get<std::string>(item.first);
}
Cout(item.first, *item.second);
}
}
int RegisterKey(const std::string& key_str, int* var_ptr, int default_value) {
Flags::Instance().sflage_keys_i32.emplace(key_str, var_ptr);
return default_value;
}
std::string RegisterKey(const std::string& key_str, std::string* var_ptr,
const std::string& default_value) {
Flags::Instance().sflage_keys_str.emplace(key_str, var_ptr);
return default_value;
}