Это в основном теоретически, так как я всегда могу указать тип возвращаемого значения, но мне интересно, есть ли способ указать лямбде, что тип возвращаемого значения должен быть union(std::variant) всех возвратов в теле лямбда.
#include <iostream>
#include <variant>
struct A{
int val = 47;
};
struct B {
float val = 4.7;
};
int main()
{
for (int i=0;i<8;++i){
// can this be something like -> auto_variant (auto_variant is some library type)
auto var = []()->std::variant<A, B> {
if (rand()%2 ){
return A{};
} else {
return B{};
}
}();
std::visit ([](const auto& val) {std::cout<< val.val << std::endl;}, var);
}
}
примечание: у меня сильное ощущение, что ответ НЕТ, это невозможно, но мне любопытно, знает ли кто-нибудь какой-нибудь трюк.
note2: использование std::any не соответствует моим требованиям, так как я хочу, чтобы возвращаемый тип лямбда был известен во время компиляции, а не во время выполнения (с any_cast
).
std::variant<A, B>
. Может быть, с отражением (но я тоже сомневаюсь, что мы можем это сделать). - person Jarod42   schedule 09.02.2021std::variant<A, B>
, а неstd::variant<B, A>
? - person Kevin   schedule 09.02.2021std::variant
, поэтому вывод возвращаемого значения лямбда не является проблемой. Обратите внимание, что это моя личная практика, которую я считаю весьма полезной, поэтому, если она вам не нравится, не жалуйтесь на нее. - person Marek R   schedule 09.02.2021