簡體   English   中英

如何定義靜態運算符<<?

[英]How to define a static operator<<?

是否可以定義靜態插入操作符,該操作符僅對類的靜態成員進行操作? 就像是:

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 ++提供了具有類型參數的模板,無論如何都不會幫助您在類型上重載函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM