Проблема в том, что у меня есть функция, которая принимает аргумент с переменным числом аргументов. Я хочу использовать это для печати 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