No artigo sobre std::any nós mostramos, além de outras informações, o quão pode ser complicado converter enum
para std::string
e entre outros tipos de operações. Nesse artigo conheceremos uma header-only: magic_enum, que pode facilitar, e muito, operações com enum
A biblioteca magic_enum
é uma ferramenta útil para trabalhar com enums em C++. Ela fornece funcionalidades avançadas que não são oferecidas nativamente pela linguagem. Aqui estão alguns dos principais recursos que magic_enum
oferece veremos nos exemplos.
Faça o download do arquivo .hpp
:
curl -LO https://github.com/Neargye/magic_enum/raw/master/include/magic_enum/magic_enum.hpp
Instale o cURL, ex.:
sudo apt install curl
wget -4 https://github.com/Neargye/magic_enum/raw/master/include/magic_enum/magic_enum.hpp
Invoke-WebRequest -Uri "https://github.com/Neargye/magic_enum/raw/master/include/magic_enum/magic_enum.hpp" -OutFile "magic_enum.hpp"
Adicione o magic_enum.hpp
ao seu código:
#include "./magic_enum.hpp"
Para nossos exemplos vamos utilizar esse enum
:
enum Color {
RED,
GREEN,
BLUE
};
std::string str = magic_enum::enum_name(Color::GREEN).data();
auto color = magic_enum::enum_cast<Color>("GREEN");
if(color.has_value()){
// color.value() é Color::GREEN
}
for(auto color : magic_enum::enum_values<Color>()){
std::cout << magic_enum::enum_name(color) << '\n';
}
constexpr std::size_t color_count = magic_enum::enum_count<Color>(); // 3
bool is_valid = magic_enum::enum_contains<Color>(2); // true
auto index = magic_enum::enum_index(Color::BLUE); // 2
auto color = magic_enum::enum_value<Color>(index.value()); // Color::BLUE
A biblioteca magic_enum
é especialmente útil quando você precisa de introspecção em enums, como para serialização, debug, ou geração de código onde é necessário trabalhar com os nomes dos valores dos enums e suas representações de string. Ela simplifica o código e elimina a necessidade de manutenção manual de mapas de enum
para std::string
e vice-versa.
Para mais informações acesse o repositório no GitHub.