Передать гетерогенный список инициализатора оператору потока - PullRequest
0 голосов
/ 16 октября 2018

Можно ли передать оператору потоковой отладки список разнородных типов, пригодных для преобразования?

string str("blabla");
std::cout << {"A", 3,  str} << std::endl;

Я полагаю, что это возможно с чем-то вроде шаблона с переменным числом аргументов?Я хочу, чтобы оператор << вызывал каждый из элементов в списке и добавлял запятую. </p>

1 Ответ

0 голосов
/ 16 октября 2018

Нельзя использовать список инициализаторов для разнородных типов, но std::tuple в порядке.

Убедитесь, что ненужная копия не сделана.Вот решение с использованием C ++ 17.

#include <tuple>
#include <string>
#include <iostream>

template<class... Ts>
std::ostream&
operator<<(std::ostream &os, std::tuple<Ts...> &&tp)
{
    auto lam = [&] (auto &&arg0, auto&& ...args) -> auto&& {
        os << arg0;
        ([&] (auto&& arg) {
            os << ", " << arg;
        } (args), ...);
        return os;
    };

    return std::apply(lam, std::move(tp));
}

int main() {
    std::string str("blabla");
    std::cout << std::forward_as_tuple("A", 3,  str) << std::endl;
}
...