Tenho um objeto do tipo std::variant<std::monostate, T...>
, mas preciso chamar uma função que aceita somente std::variant<T...>
.
Existe alguma maneira de converter a std::variant<std::monostate, T...>
para std::variant<T...>
se eu tiver certeza de que não é um std::monostate
?
Você pode usar
std::visit()
, você só precisa lidar com o caso em que éstd::monostate
, você pode lançar uma exceção por enquanto, ou em C++23 usarstd::unreachable
:A implementação
overloads
é dastd::visit()
página cppreference .Para o caso simples que
std::monostate
é o primeiro parâmetro, você pode usar este modelo:Demonstração on-line
E, se os tipos não estiverem na mesma ordem, você pode modificar o modelo e passar o tipo de variante necessário como um parâmetro de modelo e usá-lo como um tipo de retorno para as lambdas.
Versão de encaminhamento perfeito do C++20 (1 movimento a menos)