Eu tenho uma classe enum com dois valores e quero criar um método que receba um valor e retorne o outro. Também quero manter a segurança do tipo (é por isso que uso a classe enum em vez de enumerações).
http://www.cplusplus.com/doc/tutorial/other_data_types/ não menciona nada sobre métodos No entanto, fiquei com a impressão de que qualquer tipo de classe pode ter métodos.
enum class/struct
?Respostas:
Não, eles não podem.
Eu posso entender que a
enum class
parte das enumerações fortemente tipadas no C ++ 11 pode parecer implicar que você tambémenum
temclass
características, mas não é o caso. Meu palpite é que a escolha das palavras-chave foi inspirada no padrão que usamos antes do C ++ 11 para obter enumerações no escopo:No entanto, isso é apenas sintaxe. Novamente,
enum class
não é umclass
.fonte
union
não é o que John Doe consideraria uma classe também. No entanto, eles podem ter funções de membro. E as aulas realmente não são obrigatórias para funções-membro. Usando um designador comovalue
outhis
, algo comoenum Size { Huge, Mega, Apocalypse; bool operator<(X rhs) const { return *this < rhs; }
(aqui também permite;
), ele pode fazer tanto sentido quanto outras formas de funções.Embora a resposta que "você não pode" seja tecnicamente correta, acredito que você consiga atingir o comportamento que procura usando a seguinte idéia:
Eu imagino que você queira escrever algo como:
E você esperava que o código fosse algo assim:
Mas é claro que não funciona, porque as enumerações não podem ter métodos (e 'isso' não significa nada no contexto acima)
No entanto, se você usar a ideia de uma classe normal contendo uma enumeração que não seja de classe e uma variável de membro único que contenha um valor desse tipo, poderá ficar extremamente próximo da segurança de sintaxe / comportamento / tipo que deseja. ou seja:
Agora você pode escrever:
E o compilador impedirá coisas como:
Você pode facilmente adicionar métodos como:
e
pode ser suportado.
fonte
Concentrando-se na descrição da pergunta em vez do título, uma resposta possível é
fonte
Como mencionado na outra resposta , não. Mesmo
enum class
não é uma aula.Geralmente, é necessário ter métodos para obter
enum
resultados, porque não é um enum regular (apenas incrementado), mas um tipo de definição bit a bit de valores a serem mascarados ou precisa de outras operações aritméticas de bits:Obviamente, pensa-se em encapsular as operações necessárias para reconfigurar um único / grupo de bits, por exemplo, valor da máscara de bits ou mesmo operações orientadas por índices de bits, seriam úteis para a manipulação de um conjunto de 'sinalizadores'.
o c ++ 11
struct
/class
especificação apenas suporta melhor escopo dos valores de enumeração para acesso. Nem mais nem menos!As formas de sair da restrição que você não pode declarar métodos para enum (classes) são: usar uma
std::bitset
(classe wrapper) ou um campo de bitsunion
.union
s, e essas uniões de campo de bits podem ter métodos (veja aqui as restrições!).Eu tenho uma amostra, como converter valores de máscara de bits (como mostrado acima) em seus índices de bits correspondentes, que podem ser usados
std::bitset
aqui: BitIndexConverter.hppEu achei isso muito útil para melhorar a legibilidade de algumas decisões 'flag' baseadas em algoritmos.
fonte
Existe uma capacidade bastante compatível (§) de refatorar uma enumeração em uma classe sem precisar reescrever seu código, o que significa que efetivamente você pode fazer o que estava pedindo sem muita edição.
(§) como o ElementW aponta em um comentário, o código dependente de type_traits não funcionará, portanto, por exemplo, não se pode usar auto, etc. Pode haver alguma maneira de lidar com essas coisas, mas no final a pessoa está convertendo uma enumeração em uma classe, e é sempre um erro subverter C ++
as especificações
enum struct
eenum class
são sobre o escopo, portanto não fazem parte disso.Seu enum original é, por exemplo, 'animal de estimação' (este é apenas um exemplo!).
(1) Você modifica isso para, por exemplo, petEnum (para ocultá-lo do seu código existente).
(2) Você adiciona uma nova declaração de classe abaixo (nomeada com a enumeração original)
(3) Agora você pode adicionar quaisquer métodos de classe que desejar à sua classe de animais de estimação. por exemplo. um operador de cadeia
Agora você pode usar, por exemplo, std :: cout ...
fonte
pet
typename / instance, seja modelos,auto
oudecltype
, isso quebra, como você começa umapetEnum
vez.Pode não atender a todas as suas necessidades, mas com operadores não membros você ainda pode se divertir muito. Por exemplo:
Isso permite que códigos como
fonte