将异构初始化器列表传递给流运算符

时间:2018-10-16 10:19:41

标签: c++ templates streaming variadic-templates heterogeneous-array

是否可以将可流式处理的异构类型列表传递给调试流式运算符?

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

我猜想像可变参数模板一样有可能吗?我希望运算符<<调用列表中的每个元素并添加逗号。

1 个答案:

答案 0 :(得分:3)

您不能将初始化器列表用于异构类型,但是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;
}