Причина, по которой ваше исследование провалилось, состоит в том, что «тег» - это очень широкий, общий термин, который на самом деле не описывает то, что вы делаете.
По сути, вы пытаетесь сопоставить две части данных вместе; это действительно так. Не имеет значения, является ли одна из этих частей (ваш «тег») целым числом, членом перечисления, строкой, экземпляром класса или чем-то еще.
Вы сказали «Мне понадобится новая карта для каждого тега «», но я не согласен. Вам нужна только мульти-карта от «тега» к функциям (и, в худшем случае, еще одна мульти-карта от функций к «тегу», если вам также нужен обратный поиск). Это довольно тривиально.
enum class Tag
{
WiFi,
Haptic,
Network,
Notification
};
using Function = std::function<void()>; // or whatever it is
std::multimap<Tag, Function> tagLookup;
void BindTag(const Tag tag, Function func)
{
tagLookup.emplace(tag, std::move(func)); // I'm using move out of habit
}
void RunFuncsForTag(const Tag tag)
{
auto [start, end] = tagLookup.equal_range(tag);
for (auto it = start; it != end; ++it)
{
const Function& func = it->second;
func();
}
}
int main()
{
BindTag(...);
BindTag(...);
RunFuncsForTag(tag);
}
По общему признанию, если вам не нужно много копий вашего std::function
, есть еще кое-что, что нужно сделать (вы можете сохранить их в другом контейнере и иметь другое сопоставление чтобы выполнить этот поиск для каждой функции, сохраненной один раз), но основной принцип хранения данных c здесь довольно прост.