cpp
复制代码
class Config
{
friend class Singleton<Config>;
public:
Config(){}
~Config(){}
bool ReadConfig(const std::string config_path)
{
std::cout << config_path << "---" << config_path.empty() << std::endl;
if (config_path.empty())
{
std::cout << "congfig file does not exist." << std::endl;
return false;
}
std::ifstream input(config_path);
input >> config_info_;
input.close();
return true;
}
#if 1
// c++14
template<typename T>
typename std::enable_if<std::is_same<T, int>::value, bool>::type
GetConfig(std::string key_str, T& value)
{
bool ret = false;
if (config_info_.empty() || config_info_[key_str].isNull())
{
LOG(ERROR) << "get config value failure, key is :" << key_str;
return false;
}
if (config_info_[key_str].isConvertibleTo(Json::intValue))
{
value = config_info_[key_str].asInt();
ret =true;;
}
LOG(INFO) << "config " << key_str << " is :" << value;
return ret;
}
template<typename T>
typename std::enable_if<std::is_same<T, std::string>::value, bool>::type
GetConfig(std::string key_str, T& value)
{
bool ret = false;
if (config_info_.empty() || config_info_[key_str].isNull())
{
LOG(ERROR) << "get config value failure, key is :" << key_str;
return false;
}
if (config_info_[key_str].isConvertibleTo(Json::stringValue))
{
value = config_info_[key_str].asString();
ret =true;;
}
LOG(INFO) << "config " << key_str << " is :" << value;
return ret;
}
template<typename T>
typename std::enable_if<std::is_same<T, double>::value, bool>::type
GetConfig(std::string key_str, T& value)
{
bool ret = false;
if (config_info_.empty() || config_info_[key_str].isNull())
{
LOG(ERROR) << "get config value failure, key is :" << key_str;
return false;
}
if (config_info_[key_str].isConvertibleTo(Json::realValue))
{
value = config_info_[key_str].asDouble();
ret =true;;
}
LOG(INFO) << "config " << key_str << " is :" << value;
return ret;
}
template<typename T>
typename std::enable_if<std::is_same<T, Json::Value>::value, bool>::type
GetConfig(std::string key_str, T& value)
{
if (config_info_.empty() || config_info_[key_str].isNull())
{
LOG(ERROR) << "get config value failure, key is :" << key_str;
return false;
}
value = config_info_[key_str];
LOG(INFO) << "config " << key_str << " is :" << value;
return true;
}
#else
template <typename T>
bool GetConfig(const std::string key_str, T& value)
{
if (config_info_.empty() || config_info_[key_str].isNull())
{
LOG(ERROR) << "get config value failure, key is :" << key_str;
return false;
}
// if (std::is_same<T, int>::value)
// {
// value = config_info_[key_str].asInt();
// }
// else if (std::is_same<T, std::string>::value) {
// value = config_info_[key_str].asString();
// }
// else if (std::is_same<T, double>::value) {
// value = config_info_[key_str].asDouble();
// }
// else if (std::is_same<T, Json::Value>::value) {
// value = config_info_[key_str];
// }
//else {
// LOG(ERROR) << "get config value failure, The parameter type is incorrect :" << typeid(T).name();
// return false;
//}
if constexpr (std::is_same_v<T, int>)
{
value = config_info_[key_str].asInt();
}
else if constexpr (std::is_same_v<T, std::string>) {
value = config_info_[key_str].asString();
}
else if constexpr (std::is_same_v<T, double>) {
value = config_info_[key_str].asDouble();
}
else if constexpr (std::is_same_v<T, Json::Value>) {
value = config_info_[key_str];
}
else {
LOG(ERROR) << "get config value failure, The parameter type is incorrect :" << typeid(T).name();
return false;
}
LOG(INFO) << "config " << key_str << " is :" << value;
return true;
}
#endif
private:
Json::Value config_info_;
};
typedef Singleton<Config> Configurator;