过载流运算符的功能

时间:2015-10-21 02:40:39

标签: c++

我很好奇是否有可能为函数重载<<流操作符?

我在Windows上使用OutputDebugString来写入日志,它只接受字符串。

我想知道我是否可以在c ++中编写一个函数,我可以在其中包装OutputDebugString并执行以下操作

MyLogFuntion() << string << int << char;

2 个答案:

答案 0 :(得分:2)

您可以从具有operator <<的函数返回一个对象,然后在对象的析构函数中进行日志记录。然后当你调用MyLogFunction()时,它将创建一个临时对象,它将存储插入其中的所有数据,然后在对象超出语句末尾的范围时输出它。

这里是example(没有记录器功能,实际上是多余的)

#include <iostream>
#include <sstream>


class Logger {
    std::stringstream ss;
public:
    ~Logger() {
      // You want: OutputDebugString(ss.str()); 
      std::cout<< ss.str(); 
    }

    // General for all types supported by stringstream
    template<typename T>
    Logger& operator<<(const T& arg) {
       ss << arg;
       return *this;
    }

    // You can override for specific types
    Logger& operator<<(bool b) {  
       ss << (b? "Yep" : "Nope");
       return *this;
    }
};


int main() {
    Logger() << "Is the answer " << 42 << "? " << true;
}

输出:

  

答案是42吗?是的

答案 1 :(得分:0)

您不能以您希望的方式提供重载。

如果您使用的方法(在您的情况下为OutputDebugString强制您提供std::string(或类似)参数,你必须以某种方式提供该参数。一种方法是使用std::stringstream流,然后将结果传递给OutputDebugString

std::stringstream ss;
ss << whatever << " you " << want << to << stream;
OutputDebugString(ss.str());

如果你真的想要更紧凑的东西,你也可以将它转储到宏中:

#define OUTPUT_DEBUG_STRING(streamdata)   \
  do {                                    \
    std::stringstream ss;                 \
    ss << streamdata;                     \
  } while (0)

然后写

OUTPUT_DEBUG_STRING(whatever << " you " << want << to << stream);

另一种方法是在OutputDebugString周围编写一个更复杂的包装类,它提供了流操作符。但这可能不值得付出努力。