Pergunta

Tenho um código que está se multiplicando um enum por um número inteiro:

QuantLib::Date date2 = date + 12 * QuantLib::Months;

Onde QuantLib::Meses é definido como:

enum TimeUnit { Days,
                Weeks,
                Months,
                Years
};

Isso me dá o resultado desejado de data2 sendo um ano de data.No entanto, eu não sou capaz de compreender como isto está sendo alcançado.

Eu achava que isso não seria compilar.Agora eu sinto que estou chegando a um "doze meses de objeto", o que o é em seguida tratado pelo QuantLib::Date '+' a sobrecarga do operador, mas eu nunca vi esse estilo antes.

Eu vim de um C# plano de fundo, então não pode ser algo que eu não estou ciente de trabalho aqui.Alguém pode explicar o que está acontecendo?Qualquer referência a documentação será apreciada.

Foi útil?

Solução

Um dos seguintes está em vigor aqui:

  1. Em C++, um tipo de enumeração pode ser implicitamente convertido para um tipo integral.Se isso está acontecendo aqui, date + 12 * QuantLib::Months seria o mesmo que date + 12 * 2.

  2. Também é possível sobrecarga de operadores para os tipos de enumeração.Nesse caso, pode ser que a biblioteca define uma operator* (int, QuantLib::TimeUnit) que retorna algo compatível com o + você está fazendo.

Eu não sei QuantLib, mas eu acho que o #2 é o que está acontecendo. QuantLib documentação corrobora com isso (graças a @DaliborFrivaldsky para o link).

Outras dicas

Por padrão, todas as enumerações são basicamente constantes inteiro, e, como todos os valores inteiros você pode usá-los em expressões aritméticas.

No seu caso é a constante QuantLib::Months tem o valor 2, como enumerações começa a partir do zero, e são simplesmente aumentou.


No entanto, a menos que você tem para fazer a sua própria data/hora funcionalidade, eu sugiro que você use a funcionalidade disponível a biblioteca padrão <chrono> cabeçalho (ou Aumentar chrono se você não tem um C++11, capaz de compilador/biblioteca).Ele tem toda essa funcionalidade embutida.

Aqui está um exemplo semelhante ao seu código

auto now = std::chrono::system_clock::now();  // The current time at the moment
auto then = now + std::chrono::hours(24 * 365);

A variável then agora vai ser um time_point 24 * 365 horas, no futuro, a partir de now.

No seu exemplo você estiver usando uma chamada sem escopo de enumeração.Cada enumeração tem subjacente um tipo integral (que não é necessária, o tipo de int Não existe uma regra padrão para enumerações em C++).De acordo com o parágrafo 4.5.3 de C++ Padrão (você perguntou alguma referência à documentação):

3 Um prvalue de uma função sem escopo tipo de enumeração cujos subjacentes tipo é não fixo (7.2) pode ser convertido para um prvalue o primeiro de uma seguintes tipos que pode representar todos os valores da enumeração (i.é., os valores no intervalo de bmin para bmax, conforme descrito no capítulo 7.2):int, unsigned int, long int, unsigned long int, long long int ou unsigned long long int.Se nenhum dos tipos de lista que pode representar todos os valores da enumeração, um prvalue de um tipo de enumeração sem escopo pode ser convertido para um prvalue estendida do tipo inteiro, com mais baixa conversão de inteiro rank (4.13) maior do que a classificação de longo prazo em que todos os valores da enumeração pode ser representado.Se não há são dois tipos estendidos assinado um é escolhido.

Assim, em seu exemplo QuantLib::Months é convertido para int, porque todos os valores da enumeração pode ser armazenado em um objeto do tipo int.Depois de costume conversões aritméticas são executadas na operação multiplicativa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top