
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.hppInstale o cURL, ex.:
sudo apt install curl
wget -4 https://github.com/Neargye/magic_enum/raw/master/include/magic_enum/magic_enum.hppInvoke-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); // trueauto index = magic_enum::enum_index(Color::BLUE); // 2 
auto color = magic_enum::enum_value<Color>(index.value()); // Color::BLUEA 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.