Использование переменной варианта в качестве входных данных для другой функции варианта

#c #boost-variant

Вопрос:

Я использую два разных варианта, в которых один может содержать больше типов, чем другой.

 typedef std::variant<boost::blank, double> EmptyDouble;
typedef std::variant<boost::blank, double, int> EmptyDoubleOrInt;
 

Теперь я хочу использовать функцию, имеющую EmptyDoubleOrInt в качестве параметра. Эта функция отлично работает для целого числа, двойного или пустого, но не для типа EmptyDouble:

 SomeFunction(EmptyDoubleOrInt input);
 

Как я могу преобразовать EmptyDouble в пробел или double, не зная, какой у него тип. Значит, это будет правильный ввод для функции?

 SomeFunction(DoSomething(emptyDouble))
 

Ответ №1:

Вы можете использовать std::visit для построения EmptyDoubleOrInt из emptyDouble :

 SomeFunction(std::visit([](const autoamp; a) -> EmptyDoubleOrInt {
    return a;
}, emptyDouble));
 

Комментарии:

1. хорошей практикой является перенос таких вещей во вспомогательные функции: godbolt.org/z/G9vxYjK5M