#include <iostream>
struct a {
enum LOCAL_A { A1, A2 };
};
enum class b { B1, B2 };
int foo(int input) { return input; }
int main(void) {
std::cout << foo(a::A1) << std::endl;
std::cout << foo(static_cast<int>(b::B2)) << std::endl;
}
O a::LOCAL_A
é o que o enum fortemente digitado está tentando alcançar, mas há uma pequena diferença: enums normais pode ser convertido em tipo inteiro, enquanto enums rigidez não pode fazê-lo sem um elenco.
Portanto, existe uma maneira de converter um valor de enumeração fortemente tipado em um tipo inteiro sem uma conversão? Se sim, como?
fonte
Como outros já disseram, você não pode ter uma conversão implícita, e isso é por projeto.
Se você quiser, pode evitar a necessidade de especificar o tipo subjacente no elenco.
fonte
Uma versão em C ++ 14 da resposta fornecida por R. Martinho Fernandes seria:
Como na resposta anterior, isso funcionará com qualquer tipo de enum e tipo subjacente. Eu adicionei a
noexcept
palavra-chave, pois ela nunca lançará uma exceção.Atualização
Isso também aparece no Effective Modern C ++ de Scott Meyers . Veja o item 10 (está detalhado nas páginas finais do item na minha cópia do livro).
fonte
fonte
Não. Não existe um caminho natural .
De fato, uma das motivações por trás da digitação forte
enum class
do C ++ 11 é impedir sua conversão silenciosa paraint
.fonte
O motivo da ausência de conversão implícita (por design) foi dado em outras respostas.
Pessoalmente, uso unário
operator+
para a conversão de classes enum para seu tipo subjacente:O que fornece muito pouco "sobrecarga de digitação":
Onde eu realmente uso uma macro para criar enums e o operador funciona de uma só vez.
fonte
Espero que isso ajude você ou outra pessoa
fonte
un.i
esse é o "membro ativo" e você só pode ler o membro ativo de uma união.static_cast
.Resposta curta é que você não pode, como as postagens acima apontam. Mas, no meu caso, eu simplesmente não queria desorganizar o espaço para nome, mas ainda tinha conversões implícitas, então fiz:
O namespacing meio que adiciona uma camada de segurança de tipo enquanto eu não tenho que converter estática nenhum valor de enumeração para o tipo subjacente.
fonte
Foo::Foo
. Os membros podem ser acessados comoFoo::bar
eFoo::baz
e podem ser implicitamente convertidos (e, portanto, não há muita segurança de tipo). Provavelmente é melhor usar quase sempre classes enum, especialmente se estiver iniciando um novo projeto.Isso parece impossível com o nativo
enum class
, mas provavelmente você pode zombar de umenum class
com umclass
:Nesse caso,
seria equivalente a:
Isso é equivalente ao original
enum class
. Você pode retornar diretamenteb::B1
para uma função com o tipo de retornob
. Você pode fazerswitch case
isso, etc.E no espírito deste exemplo, você pode usar modelos (possivelmente junto com outras coisas) para generalizar e zombar de qualquer objeto possível definido pela
enum class
sintaxe.fonte
Como muitos disseram, não há como converter automaticamente sem adicionar sobrecargas e muita complexidade, mas você pode reduzir um pouco a digitação e melhorar a aparência usando lambdas se alguma conversão for usada um pouco demais em um cenário. Isso adicionaria um pouco de sobrecarga de função, mas tornará o código mais legível em comparação com as longas seqüências static_cast, como pode ser visto abaixo. Isso pode não ser útil em todo o projeto, mas apenas em toda a classe.
fonte
O comitê C ++ deu um passo à frente (enumerações de escopo fora do espaço de nomes global) e cinquenta etapas atrás (nenhum tipo de enumeração decai para um número inteiro). Infelizmente, isso
enum class
simplesmente não é utilizável se você precisar do valor da enum de qualquer maneira não simbólica.A melhor solução é não usá-lo e, em vez disso, escopo a enum usando um espaço para nome ou uma estrutura. Para esse fim, eles são intercambiáveis. Você precisará digitar um pouco mais ao se referir ao tipo de enum, mas isso provavelmente não será frequente.
fonte