c++ - 如何将 std::variant 减少为一个值?

标签 c++ lambda discriminated-union

我有一个 C++ 17 std::variant。如何使用 lambda 将其减少为一种类型的单个实例?

我正在寻找这样的东西:

std::variant<int, std::string> v = getIntOrString();

std::string x = reduce(
  v, 
  [](int i) {
    return "It's an int: " + std::to_string(i);
  }, 
  [](std::string i) {
    return "It's a string: " + i;
  });

最佳答案

基于 cppreference 中的示例,您可以使用 std::visit :

#include <variant>
#include <string>
#include <iostream>

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

int main() {
    using v_type = std::variant<int, std::string>;
    v_type v1{1}, v2{"2"};

    auto v_to_str = overloaded{
        [](int i) { return std::to_string(i) + " was an int"; },
        [](std::string const& s) { return s + " was already a string"; }
    };

    std::cout << std::visit(v_to_str, v1) << '\n'
              << std::visit(v_to_str, v2);

}

Live Example

关于c++ - 如何将 std::variant 减少为一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44428823/

相关文章:

f# - 从文件/数据库创建可区分的联合数据

c++ - 什么是模板扣除指南,我们应该在什么时候使用它们?

c++ - 使用 lambda 的线程构建 block (TBB) 排队任务

java - 为什么使用 invokedynamic 调用 Java 8 lambda?

c++ - 接受表示不同数量参数的函数的 lambda 的类方法

java - 从 lambda 表达式排序和子列表

f# - 是否可以对受歧视联合的基础形状进行模式匹配?

generics - 如何将 F# 联合类型的使用限制为特定选项

c++ - 我的内存泄漏在哪里?

c++ - 为什么我在关于文件编码格式的 qt 代码中得到乱码结果?