【发布时间】:2021-05-13 03:28:09
【问题描述】:
这主要是理论上的,因为我总是可以拼出返回类型,但我想知道是否有办法告诉 lambda 返回类型应该是 lambda body 中所有返回的 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);
}
}
注意:我强烈的感觉是答案是否定的,这是不可能的,但我很好奇是否有人知道一些技巧。
注意2:使用 std::any 不符合我的要求,因为我希望在编译时知道 lambda 的返回类型,而不是在运行时(使用 any_cast)。
【问题讨论】:
-
我 99.99999% 确定这无法完成。您需要检查每条返回路径,我什至认为反射无法帮助您。
-
“我强烈的感觉是答案是否定的” 这里也一样。我看不出我们如何推断出
std::variant<A, B>。也许通过反思(但我怀疑我们也能做到这一点)。 -
如果可能,为什么会推断为
std::variant<A, B>而不是std::variant<B, A>? -
IMPO 这是过度使用 lambda 的示例。当我编码时,我会尽可能避免复杂的 lambda。我提取到函数/方法的复杂代码,然后 lambda 使用。使用这种方法,您的问题将不存在,因为您将拥有一个返回
std::variant的函数,因此扣除 lambda 的返回值不是问题。请注意,这是我个人的做法,我觉得它非常有用,所以如果您不喜欢它,请不要抱怨。
标签: c++ lambda c++20 std-variant