unordered_map<std::string_view, property_enum> (для IO), и нестатический "быстрый" unordered_map<property_enum, V> (для всего остального). В интернете можно найти 9001 решение для безболезненной конвертации enum в строку и обратно.
хешируемое значение в работе требуется чуть чаще чем никогда
std::hash. Так что посчитать хеш на этапе компиляции. вроде, не выйдет. Попытался протестировать на godbolt, но ни один компилятор ещё не поддерживает constexpr std::string.friend использую, чтобы уменьшить API surface, т.е. чтобы вместо двух способов вытащить хеш был один - std::hash<hashed<T>>()(h). Если этот хеш часто нужно вытаскивать напрямую из hashed, можно и добавить геттер. Поправил, чтобы friend-ился только свой, "родной" std::hash.std::string на std::string_view, и всё почти заработало, но лол, std::hash<std::string_view> тоже не constexpr. Вот не хотят они, чтобы наша задача решилась. Надо писать свою обёртку над std::string_view (my_string_view) и определять для неё constexpr std::hash.
int count(std::string_view src, std::string_view pat) {
const auto good_chars = std::unordered_set(pat.begin(), pat.end());
return std::accumulate(src.begin(), src.end(), 0, [&](char c) {
return good_chars.find(c) != good_chars.end();
});
}
std::vector<size_t>
char* input = ...;
char* stringToRemove = ...;
std::string s(input);
removeSubstrs(s, stringToRemove);
const char* output = s.c_str();
useProcessedString(output);