Atualmente, estou trabalhando em um sistema de processamento numérico que será implantado em um ambiente crítico de desempenho. Ele recebe entradas na forma de matrizes numéricas (elas usam a eigenbiblioteca, mas, para os fins desta questão, talvez seja irrelevante) e executa uma série de cálculos numéricos (produtos matriciais, concatenações etc.) para produzir saídas.
Todas as matrizes são alocadas estaticamente e seus tamanhos são conhecidos em tempo de compilação. No entanto, algumas das entradas podem ser inválidas. Nesses casos excepcionais , ainda queremos que o código seja calculado e ainda queremos que saídas não "poluídas" por valores inválidos sejam usadas.
Para dar um exemplo, vamos dar o seguinte exemplo trivial (este é pseudo-código):
Matrix a = {1, 2, NAN, 4}; // this is the "input" matrix
Scalar b = 2;
Matrix output = b * a; // this results in {2, 4, NAN, 8}
A idéia aqui é que 2, 4 e 8 são valores utilizáveis, mas a NAN deve sinalizar ao destinatário dos dados que essa entrada esteve envolvida em uma operação que envolveu um valor inválido e deve ser descartada (isso será detectado através de um std::isfinite(value)verifique antes que o valor seja usado).
Essa é uma maneira sólida de comunicar e propagar valores inutilizáveis, dado que o desempenho é crítico e a alocação de heap não é uma opção (e nem outras construções que consomem recursos, como boost::optionalponteiros)?
Existem maneiras melhores de fazer isso? Neste ponto, estou bastante satisfeito com a configuração atual, mas esperava receber algumas idéias novas ou críticas produtivas da implementação atual.