Como usar e pra que serve a biblioteca magic_enum

🪄 Ela fornece funcionalidades avançadas que não são oferecidas nativamente pela linguagem.


Como usar e pra que serve a biblioteca magic_enum


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.


Implementação

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

  • Usando o GNU wget, precisa forçar o IPv4:
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"

Exemplos

Para nossos exemplos vamos utilizar esse enum:

enum Color { 
  RED, 
  GREEN, 
  BLUE
};

1. Conversão de Enum para String: Permite converter valores de enum para suas representações de string correspondentes.

std::string str = magic_enum::enum_name(Color::GREEN).data();


2. Conversão de String para Enum: Permite converter strings para valores de enum, se a string corresponder a um nome de valor de enum.

auto color = magic_enum::enum_cast<Color>("GREEN"); 
if(color.has_value()){
 // color.value() é Color::GREEN 
}

3. Iteração sobre Valores de Enum: Permite iterar sobre todos os valores de um enum.

for(auto color : magic_enum::enum_values<Color>()){
  std::cout << magic_enum::enum_name(color) << '\n';
}

4. Obter Informações sobre o Enum: Fornece funcionalidades para obter o número de valores de um enum, verificar se um valor está dentro do intervalo válido, etc.

constexpr std::size_t color_count = magic_enum::enum_count<Color>(); // 3 
bool is_valid = magic_enum::enum_contains<Color>(2); // true

5. Enum Indexação: Permite obter o índice de um valor de enum e vice-versa.

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.


cpp cppdaily


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!