Использование выражения сгиба для создания тривиального объекта

Я пытаюсь построить объект, используя std::apply и сложить выражения. Из того, что я могу сказать, читая документацию онлайн, складывание на запятой должно работать. Вот пример для уточнения.

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

Я распаковываю кортеж, получаю последние элементы и пытаюсь вернуть новый объект, используя элементы.

Различные компиляторы жалуются y никогда не инициализируется. Как-то расширение не происходит. По крайней мере, не так, как я ожидал.

error: missing field
'y' initializer [-Werror,-Wmissing-field-initializers]
...[](auto&... vector) { return my_pair{ (vector.back(), ...) }; },
^

Если я отключу -Werror, первое значение my_pair 1, второе 0. Я попытался использовать одинарный левый сгиб, но результаты были идентичны.

Кажется, это должно работать, у cppreference есть этот вектор push_back пример, который выглядит аналогично (с моей точки зрения).

template<typename T, typename... Args>
void push_back_vec(std::vector<T>& v, Args&&... args)
{
(v.push_back(args), ...);
}

Можно ли создать объект тривиального типа (pod) с помощью выражений складывания? Если так, из распакованного кортежа?

2

Решение

Вам не нужно выражение сгиба здесь. Правильный код:

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

С вашим существующим кодом, это расширение, которое происходит:

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

Первый элемент, если инициализируется с (0.f, 1.f), который оценивает 1.f, В этом случае запятая является оператор запятой — он не разделяет аргументы во время инициализации агрегата.

9

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]