У меня есть следующий подробный код:
struct thing1 { int key, std::string value; };
struct thing2 { int key, std::string value; };
// ...
struct thingN { int key, std::string value; };
struct thing_map {
thing1 t1;
thing2 t2;
// ...
thingN tN;
std::string get(int key) {
if(t1.key == key) return t1.value;
if(t2.key == key) return t2.value;
// ...
if(tN.key == key) return tN.value;
throw std::runtime_error("bad key");
}
};
Я могу реорганизовать thing
s в std::tuple<thing1, thing2, /* ... */ thingN>
, это позволяет мне получить к ним доступ с набранным std::get
, поэтому никакой функциональностипотерял (то есть std::get<thing1>(things)
).Я не могу понять, как реализовать каскад if
.Существуют различные реализации функций, которые применяют функцию к каждому элементу кортежа в Интернете, но эти функции всегда используют пакет параметров индекса для сопоставления, поэтому я не могу выбрать один элемент и вернуть его значение.Тривиальная вещь, которую можно сделать, это, возможно, сохранить tN.value
в захваченную переменную и вернуть ее, но у меня есть ощущение, что есть лучшее решение.
Для ясности я пытаюсь сделать следующее:
struct thing_map {
std::tuple<thing1, thing2, /* ... */ thingN> things;
std::string get(int key) {
foreach(auto&& thing : things) {
if (key == thing.key) return thing.value;
}
throw std::runtime_error("bad key");
}
};
Я использую C ++ 17