Но это довольно уродливо и требует большего количества шаблонов.
Что считается самым чистым и наиболее эффективным решением этой проблемы с использованием C ++ 14?
Чтобы ответить на вышесказанное, как указал @SamerTufail (и так же, как я делаю это сам на работе), я бы использовал enum
s и std::map
следующим образом.
typedef enum {
foo = 1,
bar = 2,
} Key;
std::map<Key, std::string> hash_map = { {Key::foo ,"foo"}, { Key::bar,"bar"} };
И затем в main () вы можете получить значение, подобное этому,
std::cout << hash_map.find(Key::foo)->second;
Я бы создал функцию для возврата second
, где вы бы проверяли итератор на end()
, в противном случае интегратор был бы недействительным и использовал бы егобудет UB.
РЕДАКТИРОВАТЬ: Как и другие отмечали в комментариях и согласно этому вопросу , вы можете заменить std::map
на std::unordered_map
при условии, что вам не нужно держать элементы в порядке.
И по своему опыту я всегда создаю такие карты как static const
.Поэтому создайте их один раз и используйте их много раз, чтобы амортизировать стоимость создания.