Acho que a maneira mais fácil de usar isso seria fazer com que o parâmetro de retorno de chamada digite um argumento de modelo ou std::function<void(progress_info_t)> .
Você está fazendo um processo iterativo cujas propriedades de convergência não são facilmente previsíveis, mas que você deseja continuar até que converge, ou descobre que está em profunda doo-doo? Se ele não "imprime" informações sobre seu progresso (número de iterações, um resíduo (ou qualquer que seja o número de progresso que faça sentido), então o usuário pode ficar preocupado ", está em apuros? Poderia ser pendurado ou estar em um loop infinito? ". Então, uma coisa seria armazenar essas propriedades em um endereço (ou arquivo externo) que pode ser lido por algum processo de monitoramento. Ou a sua preocupação é bem diferente disso?
Passe a referência à sua função de retorno de chamada como um parâmetro adicional para o seu algoritmo.
Se você não quer incomodar com os callbacks desta invocação, passe uma simples função stub que não faz nada mais do que retornar.
Dependendo da natureza do produto, conheço mais do que alguns desenvolvedores que acabaram de colocar uma barra de progresso deslizante que vai a cada segundo ou dois (poucos por cento por escala), o que não tem nenhuma relação com o progresso real. Há um retorno de chamada no final para torná-lo flash para 100% (ou não). É um hack total, mas, novamente, uma barra de progresso é apenas uma ferramenta para dizer ao usuário "por favor, espere, sim, o programa não quebrou e está realmente fazendo alguma coisa".
Se você está falando sobre uma grande e complicada notificação de progresso de instalação, isso não é uma boa ideia, mas para algo que pode levar 30 segundos ou menos, tudo bem.