تعریف کلاس کانفیگ - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تعریف کلاس کانفیگ

+1 امتیاز

یک کلاس کانفیگ را با این خصوصیات تعریف کنید. ذخیره کنید و این کلاس را در فایل توسط nlohmann بارگذاری کنید. دو متد getParam و setParam را اضافه کنید که تمام پارامترها را با مقدار رشته دریافت و تنظیم کنید. اگر از مقدار پیش‌فرض بار پارامتری خارج نشد، روش load را بررسی کنید.

vector<int> old_date_list,date_list;
 std::string old_doc_type_filename;
 float old_doc_conf;
 bool doc_type_reco; 
bool defect_type_reco; 
bool date_reco;

 

سوال شده اردیبهشت 2, 1402  بوسیله ی Lori3 (امتیاز 857)   11 36 105

1 پاسخ

+1 امتیاز
 
بهترین پاسخ
//config.h
#pragma once

#include <iostream>
#include <fstream>
#include <vector>
#include <nlohmann/json.hpp>


using json = nlohmann::json;

class Config {
public:
	using Ptr = std::shared_ptr<Config>;

	std::vector<int> old_date_list_;
	std::vector<int> date_list_;
	std::string old_doc_type_filename_;
	float old_doc_conf_;
	bool doc_type_reco_;
	bool defect_type_reco_;
	bool date_reco_;

	Config(const std::string& filename);
	void save(const std::string& filename);
	void load(const std::string& filename);
	std::string getParam(const std::string& param_name);
	void setParam(const std::string& param_name, const std::string& value);

	
};

//config.cpp

#include "Config.h"

Config::Config(const std::string& filename){
	old_date_list_ = {  };
	date_list_.resize(43);
	std::iota(date_list_.begin(), date_list_.end(), 1);

	old_doc_type_filename_ = "";
	old_doc_conf_ = 0.6f;
	doc_type_reco_ = true;
	defect_type_reco_ = true;
	date_reco_ = true;
}

void Config::save(const std::string& filename) {

		json j;
		j["old_date_list"] = old_date_list_;
		j["date_list"] = date_list_;
		j["old_doc_type_filename"] = old_doc_type_filename_;
		j["old_doc_conf"] = old_doc_conf_;
		j["doc_type_reco"] = doc_type_reco_;
		j["defect_type_reco"] = defect_type_reco_;
		j["date_reco"] = date_reco_;

		std::ofstream file(filename);
		file << j.dump(4);
}

void Config::load(const std::string& filename) {
	std::ifstream file(filename);
	if (file.is_open()) {
		json j;
		file >> j;

		if (j.contains("old_date_list")) {
			old_date_list_ = j["old_date_list"].get<std::vector<int>>();
		}
		if (j.contains("date_list")) {
			date_list_ = j["date_list"].get<std::vector<int>>();
		}
		if (j.contains("old_doc_type_filename")) {
			old_doc_type_filename_ = j["old_doc_type_filename"].get<std::string>();
		}
		if (j.contains("old_doc_conf")) {
			old_doc_conf_ = j["old_doc_conf"].get<float>();
		}
		if (j.contains("doc_type_reco")) {
			doc_type_reco_ = j["doc_type_reco"].get<bool>();
		}
		if (j.contains("defect_type_reco")) {
			defect_type_reco_ = j["defect_type_reco"].get<bool>();
		}
		if (j.contains("date_reco")) {
			date_reco_ = j["date_reco"].get<bool>();
		}
	}
	else save(filename);
	
}

std::string Config::getParam(const std::string& param_name) {
	if (param_name == "old_date_list") {
		return json(old_date_list_).dump();
	}
	else if (param_name == "date_list") {
		return json(date_list_).dump();
	}
	else if (param_name == "old_doc_type_filename") {
		return json(old_doc_type_filename_).dump();
	}
	else if (param_name == "old_doc_conf") {
		return json(old_doc_conf_).dump();
	}
	else if (param_name == "doc_type_reco") {
		return json(doc_type_reco_).dump();
	}
	else if (param_name == "doc_type_reco") {
		return json(defect_type_reco_).dump();
	}
	else if (param_name == "date_reco") {
		return json(date_reco_).dump();
	}
	else {
		throw std::invalid_argument("Invalid parameter name");
	}
}

bool Config::getProcEnable(ProcType index)
{
	bool result = false;
	switch (index)
	{
	case ProcType::DocType:
		result = doc_type_reco_;
		break;
	case ProcType::DefectType:
		result = defect_type_reco_;
		break;
	case ProcType::Date:
		result = date_reco_;
		break;
	default:
		break;
	}
	return false;
}

void Config::setParam(const std::string& param_name, const std::string& value) {
	if (param_name == "old_date_list") {
		old_date_list_ = json::parse(value).get<std::vector<int>>();
	}
	else if (param_name == "date_list") {
		date_list_ = json::parse(value).get<std::vector<int>>();
	}
	else if (param_name == "old_doc_type_filename") {
		old_doc_type_filename_ = json::parse(value).get<std::string>();
	}
	else if (param_name == "old_doc_conf") {
		old_doc_conf_ = json::parse(value).get<float>();
	}
	else if (param_name == "doc_type_reco") {
		doc_type_reco_ = json::parse(value).get<bool>();
	}
	else if (param_name == "defect_type_reco") {
		defect_type_reco_ = json::parse(value).get<bool>();
	}
	else if (param_name == "date_reco") {
		date_reco_ = json::parse(value).get<bool>();
	}
	else {
		throw std::invalid_argument("Invalid parameter name");
	}
}

 

پاسخ داده شده اردیبهشت 6, 1402 بوسیله ی ابید (امتیاز 781)   19 90 106
انتخاب شد شهریور 8, 1402 بوسیله ی farnoosh
...