我可以让 lambda 推导出变体返回类型吗?

NoS*_*tAl 6 c++ lambda c++20 std-variant

这主要是理论上的,因为我总是可以拼出返回类型,但我想知道是否有办法告诉 lambda 返回类型应该是 lambda 主体中所有返回的 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我强烈的感觉是答案是否定的,这是不可能的,但我很好奇是否有人知道一些技巧。

注意2:使用 std::any 不符合我的要求,因为我希望在编译时知道 lambda 的返回类型,而不是在运行时(使用any_cast)。

pro*_*-fh 3

你会发现我在作弊,但也许

using A_or_B = std::variant<A, B>;
Run Code Online (Sandbox Code Playgroud)

然后

[]() {
  if (rand()%2) {
    return A_or_B{A{}};
  } else {
    return A_or_B{B{}};
  }
}
Run Code Online (Sandbox Code Playgroud)

有窍门吗?

  • 首先,这确实不能自动化,我相信这正是OP正在寻找的。另外,为什么不使用尾随返回类型,这样就不必不断重复“A_or_B”? (2认同)