[英]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.