重载输出<< operator for class,以打印其中的元组

use*_*808 6 c++ iostream tuples operator-overloading

所以,如果我有这样的事情

template<typename... Args >
class tuple_class
{
  public:
  std::tuple<Args...> tup;

/*I left out the other functions */
};
Run Code Online (Sandbox Code Playgroud)

我想重载运算符<<,以便它在类上调用时递归打印元组.

恩.

auto a = tuple_class(1, 2 ,3);
std::cout << a << endl;
Run Code Online (Sandbox Code Playgroud)

希望打印'123'

我见过了元组打印机的其他例子,但我不能在没有麻烦的情况下将它应用到我的班级

我想我应该从这样的成员函数开始

  template<typename... Args>
  friend std::ostream& operator<<(std::ostream& os, const my_tuple<Args...> &m);
Run Code Online (Sandbox Code Playgroud)

然后是课外的实际功能

template<typename... Args>
std::ostream& operator<<(std::ostream& os, const my_tuple<Args...> &m)
{
   os << "SOMETHING" << std::endl;
   return os;
}
Run Code Online (Sandbox Code Playgroud)

当我在班上调用<<运算符时,这实际上有效.但我不知道如何让它实际打印元组.

任何帮助,将不胜感激

Loo*_*pes 2

为了构建解决方案,我使用了这里提到的cppreference中的元组打印代码this。其余的代码是将事物粘合在一起的粘合剂。我在这里放置了工作示例。

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

// tuple printer
template<class Tuple, std::size_t N>
struct TuplePrinter {
    static std::ostream& print(std::ostream& os, const Tuple& t)
    {
        TuplePrinter<Tuple, N - 1>::print(os, t);
        os << ", " << std::get<N - 1>(t);
        return os;
    }
};

template<class Tuple>
struct TuplePrinter<Tuple, 1> {
    static std::ostream& print(std::ostream& os, const Tuple& t)
    {
        os << std::get<0>(t);
        return os;
    }
};

template<class... Args>
std::ostream& print(std::ostream& os, const std::tuple<Args...>& t)
{
    os << "(";
    TuplePrinter<decltype(t), sizeof...(Args)>::print(os, t);
    os << ")\n";
    return os;
}


// class to keep tuple inside
template<typename... Args>
class tuple_class {
    template<typename... Args2>
    friend std::ostream& operator<<(std::ostream& os, const tuple_class<Args2...> &m);

    std::tuple<Args...> tup;
public:
    tuple_class(Args&&... args) : tup(std::forward<Args>(args)...) {

    }
};

// usage of the printer
template<typename... Args>
std::ostream& operator<<(std::ostream& os, const tuple_class<Args...> &m) {
    print(os, m.tup);
    return os;
}



int main() {
    tuple_class<int,float,std::string> tc( 1,3.0f,"string" );
    std::cout << tc;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)