Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将std::variant减少为一个值? 我有一个C++ 17代码> STD::如何使用lambdas将其简化为一种类型的单个实例_C++_Lambda_Discriminated Union - Fatal编程技术网

如何将std::variant减少为一个值? 我有一个C++ 17代码> STD::如何使用lambdas将其简化为一种类型的单个实例

如何将std::variant减少为一个值? 我有一个C++ 17代码> STD::如何使用lambdas将其简化为一种类型的单个实例,c++,lambda,discriminated-union,C++,Lambda,Discriminated Union,我在找这样的东西: 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; }); std::variant v=getI

我在找这样的东西:

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;
  });
std::variant v=getIntOrString();
std::string x=reduce(
v
[](国际一){
返回“It's a int:”+std::to_string(i);
}, 
[](标准::字符串i){
return“It'sastring:+i;
});

以CPPFREFERENCE中的示例为基础,您可以使用:

#包括
#包括
#包括
模板结构重载:Ts。。。{使用Ts::运算符()…;};
模板重载(Ts…)->重载;
int main(){
使用v_type=std::variant;
v_型v1{1},v2{“2};
自动v_至_str=过载{
[](int i){return std::to_string(i)+“was a int”},
[](std::string const&s){return s+“已经是字符串”;}
};

STD::Cuth:Ungult>重载类只是简单的!@ Angew,它确实是。它还显示了多么好的类模板演绎。一个代码> MaMyOxOpUngy/<代码>函数需要更多的代码来绕过被删除的lambda闭包的默认代码。我刚刚意识到有多少C++语言特性有效。加载的
是聚合初始化的,因此每个lambda(作为一个prvalue)直接初始化为重载的的子对象,这是由于保证了复制省略。我还没有看汇编,但是win的零成本抽象(假设空基优化)。
#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);

}