Я пытаюсь построить объект, используя 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) с помощью выражений складывания? Если так, из распакованного кортежа?
Вам не нужно выражение сгиба здесь. Правильный код:
[](auto&... vector)
{
return my_pair{vector.back()...};
}
С вашим существующим кодом, это расширение, которое происходит:
return my_pair{ (0.f, 1.f) }
Первый элемент, если инициализируется с (0.f, 1.f)
, который оценивает 1.f
, В этом случае запятая является оператор запятой — он не разделяет аргументы во время инициализации агрегата.
Других решений пока нет …