【问题标题】:Can I make lambdas deduce the variant return type?我可以让 lambdas 推断出变体返回类型吗?
【发布时间】: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&lt;A, B&gt;。也许通过反思(但我怀疑我们也能做到这一点)。
  • 如果可能,为什么会推断为std::variant&lt;A, B&gt; 而不是std::variant&lt;B, A&gt;
  • IMPO 这是过度使用 lambda 的示例。当我编码时,我会尽可能避免复杂的 lambda。我提取到函数/方法的复杂代码,然后 lambda 使用。使用这种方法,您的问题将不存在,因为您将拥有一个返回 std::variant 的函数,因此扣除 lambda 的返回值不是问题。请注意,这是我个人的做法,我觉得它非常有用,所以如果您不喜欢它,请不要抱怨。

标签: c++ lambda c++20 std-variant


【解决方案1】:

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

using A_or_B = std::variant<A, B>;

然后

[]() {
  if (rand()%2) {
    return A_or_B{A{}};
  } else {
    return A_or_B{B{}};
  }
}

成功了吗?

【讨论】:

  • 首先,这真的不能自动化,我相信这是 OP 正在寻找的。另外,为什么不使用尾随返回类型,这样您就不必不断重复A_or_B
  • @NathanOliver 我同意你的观点(因此我的第一句话......),但我不知道 OP 的意图,那为什么不呢? (有些人抱怨将简短的答案发布为 cmets,这就是为什么我敢发布这个答案我觉得有点荒谬......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2020-08-21
相关资源
最近更新 更多