int GetValue(std::string section, std::string key, int def) { if (!ini.has(section)) return def; if (!ini[section].has(key)) return def; std::string& val = ini[section][key]; if (!val.empty()) { return std::stoi(val); } else { return def; }
val.clear(); } I mam to zduplikowany dla każdej zmiennej np bool GetValue, float GetValue itd. Da się to zrobić w jednej metodzie? np. jak w javie T GetValue?
@mamniciwszystko: W C++ możesz osiągnąć podobny efekt jak w Javie przy użyciu szablonów (ang. templates). Szablony pozwalają na definiowanie funkcji, które mogą działać z różnymi typami danych. Możesz stworzyć ogólną funkcję GetValue, która przyjmuje typ jako parametr szablonu. Oto jak mógłby wyglądać Twój kod:
@mamniciwszystko: do uniwersalnego konwertowania zamiast rodziny stoi możesz użyć strumieni, np. wrzucenie stringa do std::stringstream i potem wyciągnięcia zmiennej danego typu tak jak byś wyciągał z std::cin. inny sposób na uniwersalną konwersję to boost::lexical_cast, pod warunkiem, że masz boosta dostępnego
int GetValue(std::string section, std::string key, int def) {
if (!ini.has(section)) return def;
if (!ini[section].has(key)) return def;
std::string& val = ini[section][key];
if (!val.empty()) {
return std::stoi(val);
}
else
{
return def;
}
val.clear();
}
I mam to zduplikowany dla każdej zmiennej np
bool GetValue,float GetValueitd.Da się to zrobić w jednej metodzie? np. jak w javie
T GetValue?#programowanie
W C++ możesz osiągnąć podobny efekt jak w Javie przy użyciu szablonów (ang. templates). Szablony pozwalają na definiowanie funkcji, które mogą działać z różnymi typami danych. Możesz stworzyć ogólną funkcję GetValue, która przyjmuje typ jako parametr szablonu. Oto jak mógłby wyglądać Twój kod:
#include <string>
#include <sstream>
#include
template <typename Config, typename Section, typename Key, typename Default>auto GetValue(const Config& config, const Section& section, const Key& key, const Default& def) -> decltype(def) {
if (!config.has(section)) return def;
if (!config[section].has(key))
Taki wasz obraz #programista15k
stoimożesz użyć strumieni, np. wrzucenie stringa dostd::stringstreami potem wyciągnięcia zmiennej danego typu tak jak byś wyciągał zstd::cin. inny sposób na uniwersalną konwersję toboost::lexical_cast, pod warunkiem, że masz boosta dostępnego