一次处理所有传递的重载

are*_*euz 0 c++ cross-platform operator-overloading c++11

我厌倦了在现场调试代码并包含<iostream>在每个文件中.所以我想让自己成为一个通用的,自包含的,轻量级的调试类,我将只包含在标题中,然后忘记.

我想用一些东西

#include "debug.hpp"
debug DBG;
DBG << "foo and" << " bar";
//Or even better, just include it and do debug() << "foo and" << " bar";
Run Code Online (Sandbox Code Playgroud)

所以,我写了这个:

#include <iostream>
#include <string>
#include <chrono>
#include <ctime>

class Debug
{
public:    
  Debug &operator<<(std::string arg_0)
  {
    auto tempTime = std::chrono::system_clock::to_time_t(
      std::chrono::system_clock::now() );
    auto timeString(ctime(&tempTime));
    timeString = timeString.substr(timeString.find(':') - 2, 8);

    std::cout << timeString << " >> " << arg_0 << '\n';
    return *this;
  }
};
Run Code Online (Sandbox Code Playgroud)

但是,当然,这不起作用,因为正如我所知,每个重载操作符都会导致此函数(它仍被称为函数?)单独触发.创建:

hour:minute:second >> foo and
hour:minute:second >> bar
Run Code Online (Sandbox Code Playgroud)

在第一个重载运算符出现后,我可以立即传递所有内容吗?也许作为一个字符串流?另外,我不会只传递字符串,而是我需要的任何内容,这是否需要我为每个可以传递的信号类型手动创建一个单独的重载函数?

PS:跨平台解决方案是可选的,但欢迎(目前在Linux上开发)

Jar*_*d42 6

您可以返回另一个班级来完成这项工作,例如:

class Helper
{
public:
    ~Helper() { std::cout << "\n"; }

    template<typename T>
    friend Helper&& operator << (Helper&&h, const T& t) {
        std::cout << t;
        return std::move(h);
    }
};

class Debug
{
public:    
  template<typename T>
  friend Helper operator<<(Debug&, const T& t)
  {
    auto tempTime = std::chrono::system_clock::to_time_t(
      std::chrono::system_clock::now() );
    auto timeString{ctime(&tempTime)};
    timeString = timeString.substr(timeString.find(':') - 2, 8);

    std::cout << timeString << " >> " << t;
    return Helper{};
  }
};
Run Code Online (Sandbox Code Playgroud)