Как мы можем использовать std::tuple вместе с диапазонамиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как мы можем использовать std::tuple вместе с диапазонами

Сообщение Anonymous »

Проблема в том, что у меня есть функция, которая принимает аргумент с переменным числом аргументов. Я хочу использовать это для печати fmt. Я пытаюсь добиться этого, присоединившись к ним.
У меня есть функция присоединения:
template
inline auto join(const RANGE& range, std::string_view sep, Projection&& proj = std::identity{}) {
auto joined = range
| std::views::transform([&proj](const auto& element) { return std::invoke(proj, element); })
| std::views::join_with(sep);
return std::ranges::to(joined);
}

пока игнорируйте std::invoke, поскольку он просто выводит идентификатор, т.е. std::format("{}");
Если я предоставляю вектор, он работает нормально, однако, если у меня есть вариативная функция, например:
template
foo(Args... args) {
std::string goo = std::format(
"Show me the keys: {}",
join(args..., ",")
);
}

Это не работает. Я также пытался с помощью std::forward_as_tuple привести мои аргументы к std::tuple, однако это не помогло, поскольку операнд | не поддерживается std: :tuple.
У меня есть пример, показывающий случай с std::vector и std::tuple (в сочетании с вариационным аргументы)
Весь пример вставлен ниже:
#include
#include
#include
#include
#include
#include

template
inline auto join(const RANGE& range, std::string_view sep, Projection&& proj = std::identity{}) {
auto joined = range
| std::views::transform([&proj](const auto& element) { return std::invoke(proj, element); })
| std::views::join_with(sep);
return std::ranges::to(joined);
}

template
auto get(KEYS... keys) {
return std::forward_as_tuple(std::forward(keys)...);
}

int main() {
auto tuple_range = get("bla", "blas", "blaaaass");
auto vv = std::vector{"bla", "blas", "blaass"};
std::string goo = std::format(
"Show me the keys: {}",
join(vv, ",")
);
std::cout

Подробнее здесь: https://stackoverflow.com/questions/779 ... ith-ranges
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»