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) }