Wpis z mikrobloga

mam w #cpp taki kod:

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?

#programowanie
  • 7
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@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:

#include <string>
#include <sstream>
#include
  • Odpowiedz
@mamniciwszystko: tak, np.

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))
  • Odpowiedz
@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
  • Odpowiedz