Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可能使操作员过载<&书信电报;这样地?_C++_Overloading_Operator Keyword - Fatal编程技术网

C++ 是否可能使操作员过载<&书信电报;这样地?

C++ 是否可能使操作员过载<&书信电报;这样地?,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,假设我有一个叫做“记录器”的类。这个名字不言自明,它记录了很多东西。我有一个静态方法,它记录东西(Logger::log(string msg))。 我想重载运算符重载运算符对值而不是类型进行操作 也许你应该重命名你的类,然后创建一个合适的全局对象。例如: logger.h: class mylogger { /* ... */ }; extern mylogger logger; #include "logger.h" mylogger logger; logger.cpp: clas

假设我有一个叫做“记录器”的类。这个名字不言自明,它记录了很多东西。我有一个静态方法,它记录东西(Logger::log(string msg))。
我想重载运算符重载运算符对值而不是类型进行操作

也许你应该重命名你的类,然后创建一个合适的全局对象。例如:

logger.h:

class mylogger { /* ... */ };

extern mylogger logger;
#include "logger.h"

mylogger logger;
logger.cpp:

class mylogger { /* ... */ };

extern mylogger logger;
#include "logger.h"

mylogger logger;
用法:

#include "logger.h"

logger << "Done";
#包括“logger.h”

logger如果
logger
是一个类的名称,那么当然不能这样做。使用类似

Logger &log() {
    static Logger l;
    return l;
}

log() << "And the answer is" << 42;
Logger&log(){
静态记录器l;
返回l;
}

log()假设您希望利用
std::ostream
提供的输出运算符,您应该而不是尝试重载输出运算符!相反,您应该创建一个合适的流缓冲区(即从
std::streambuf
派生的类),并在该类的
overflow()
sync()
方法中实现自定义输出逻辑。然后,记录器将从
std::ostream
派生并初始化其基类以使用自定义流缓冲区。

这是可能的,但您需要弄清楚真正需要的接口。一种选择是将您的
记录器
设置为
std::ostream
(继承),然后事情就可以开箱即用了。另一种选择是维护一个与
std::ostream
无关(无继承)的记录器,但是您需要提供
logger&operator您可以用实际的格式化代码更新您的问题吗?@H2CO3:虽然它似乎是这个问题的重复,但引用问题的答案似乎都是错误的!我不认为他需要全球。。。在他想要的最后一个用法示例中,他拥有:
Logger l;l@DavidRodríguez dribeas:我对此表示怀疑。他说“我所能做的就是X,但我想要Y”。糟糕的是,我不太明白他想要什么。我在期待一些更有意义的东西;)(而不是一个单身汉)@DavidRodríguez dribeas:
std::cout
不再是一个单身汉了……好吧,如果我不能实现我的目标,我发现一个全局对象的想法是活跃的。看来我不是C++的专业人员,不太遵守<代码> SDT::CUT//Cuth>与<代码>操作器有关。QT有一个<代码> qDebug > /Cux>类。技术上它是一个宏,而不是一个类。但是,原则是一样的(返回一个对象,你可以使用
operatorLet's say我在游戏中需要这个记录器。使用'std::ostream'会有不必要的开销,对吗?我很想知道是否有人从
std::streambuf
派生过…@VilmantasBašinovas:我假设你不仅仅对记录字符串文字感兴趣(如果是这种情况,只需重载
operator@KerrekSB字体嗯,我经常这样做。考虑到这很容易,我看不出人们为什么不这么做。而且,我确信我不是唯一一个这样做的人:这是正确的做法。
Logger& operator<<(Logger& logger, std::string const& msg) {
   logger.log(msg);               // need not be, and problably should be static
   return logger;
}
template <typename T>
Logger& operator<<(Logger& logger, T const & obj) {
   // do specific work based on the type, or a completely generic approach:
   std::ostringstream st;
   st << obj;
   logger.log(st.str());
   return logger;
}
template <typename T>
Logger& operator<<(Logger& logger, T const& obj) {
   logger.stream << obj;
   return logger;
}
Logger& operator<<(Logger& logger, std::ostream& (*manip)(std::ostream&)) {
   logger.stream << manip;
   if (manip == static_cast<std::ostream& (*)(std::ostream&)>(std::flush)) {
      logger.write(); // flush to disk
   }
   return logger;
}
// add support for other manipulators...