如何定义静态运算符<<?

How to define a static operator<<?

本文关键字:lt 运算符 静态 何定义 定义      更新时间:2023-10-16

是否可以定义仅对类的静态成员操作的静态插入操作符?比如:

class MyClass
{
public:
    static std::string msg;
    static MyClass& operator<< (const std::string& token) {
        msg.append(token);
        return *this;   // error, static
    }
};

另外:

static MyClass& operator<< (MyClass&, const std::string &token)
{
    MyClass::msg.append(token);
    return ?;
}

我想这样使用它:

MyClass << "message1" << "message2";

谢谢!

在您的情况下,我可能会做的是创建另一个重载operator<<的类,然后创建该类型的静态成员。这样的:

class MyClass
{
public:
    static std::string msg;
    struct Out {
        Out & operator<< (const std::string& token) {
            MyClass::msg.append(token);
            return *this;
        }
    };
    static Out out;    
};

使用不完全是你所要求的,但我认为已经足够接近了:

MyClass::out << "message1" << "message2";

如果MyClass的所有成员都是静态的,则有可能返回一个新的实例。

但是,返回引用会产生一个问题。有两种解决方案:
    定义一个静态实例
  • 通过拷贝传递,而不是通过引用传递。

第二种方法最简单:

static MyClass operator<< (MyClass, const std::string &token)
{
     MyClass::msg.append(token);
     return MyClass();
}

第一行多一行:

static MyClass& operator<< (MyClass&, const std::string &token)
{
     static MyClass instance;
     MyClass::msg.append(token);
     return instance;
}

用法非常接近你想要的:

MyClass() << "message1" << "message2";

但是,我不建议这样做。你为什么不直接用std::ostringstream呢?你会得到格式化和更多的免费。

如果你想使用你的类作为cout,你可以做的是:

#include <iostream>
using namespace std;
namespace trace
{
  class trace
  {
  public:
    trace& operator<< (const std::string& echo)
    {
      std::cout << echo << std::endl;
      return *this;
    }
  };
  trace t; // Note that we created variable so we could use it.
};
using namespace trace; // Note that we use same namespace so we dont need to do trace::t
int main(int argv, char** argc)
{
  t << "Server started..."
    << "To exit press CTRL + Z";
  return 0;
}

输出应该与新行中的每个字符串类似:

服务器开始……退出按CTRL + Z

你不能。类名/类型本身不是一个值,您需要像

这样的表达式。
class Foobar {...};
std::cout << Foobar << std::endl;

,这样你的静态operator<<将是可用的,但这是无效的c++。a .4中的语法摘要显示,将类型名称放在那里是无效的。

还要考虑操作符重载只是具有古怪名称的函数:

T  operator<< (T, T)
   ^^^^^^^^^^ flaky name, basically same as:
T  left_shift (T, T)

c++(以及大多数其他语言,例如c#)中的函数只能作用于类型的实例,而不是类型本身。

然而,c++提供了有类型参数的模板,然而,这并不能帮助你在类型上重载函数。