Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
C++ 使用折叠表达式构造平凡对象_C++_Constructor_Tuples_C++17_Fold - Fatal编程技术网

C++ 使用折叠表达式构造平凡对象

C++ 使用折叠表达式构造平凡对象,c++,constructor,tuples,c++17,fold,C++,Constructor,Tuples,C++17,Fold,我正在尝试使用std::apply和fold表达式构造一个对象。从我在网上阅读的文档中可以看出,在逗号上折叠应该是可行的。下面是一个需要澄清的例子 struct my_pair final { float x; float y; }; struct test final { my_pair back() { return std::apply( [](auto&... vector) {

我正在尝试使用
std::apply
和fold表达式构造一个对象。从我在网上阅读的文档中可以看出,在逗号上折叠应该是可行的。下面是一个需要澄清的例子

struct my_pair final {
    float x;
    float y;
};

struct test final {
    my_pair back() {
        return std::apply(
                [](auto&... vector) {
                    return my_pair{ (vector.back(), ...) }; },
                data);
    }

    std::tuple<std::vector<float>, std::vector<float>> data
            = { { 0.f }, { 1.f } };
};
如果禁用-Werror,
my_pair
的第一个值为1,第二个值为0。我尝试使用一元左折叠,但结果完全相同

这似乎应该是可行的,cppreference有一个向量
push_back
示例,看起来很相似(从我的角度来看)

模板
void push_back_vec(std::vector&v,Args&&…Args)
{
(v.推回(args),…);
}

是否可以使用折叠表达式创建普通(pod)类型的对象?如果是这样,从一个未打包的元组开始?

这里不需要折叠表达式。正确的代码是:

[](auto&... vector) 
{
    return my_pair{vector.back()...}; 
}

对于现有代码,将进行以下扩展:

return my_pair{ (0.f, 1.f) }

如果使用
(0.f,1.f)
初始化第一个元素,其计算结果为
1.f
。在这种情况下,逗号标记是一个逗号运算符-它在聚合初始化期间不会分隔参数。

请记住,折叠表达式仍然是一个表达式<代码>y由第二个表达式初始化,您有一个。哈哈,太棒了,泰!没想到会有这么简单的解决办法:)
[](auto&... vector) 
{
    return my_pair{vector.back()...}; 
}
return my_pair{ (0.f, 1.f) }