[英]Can I make a template operator<< overload that all classes can use? C++
如果我的問題令人困惑,我的意思是:
在java中,如果你是System.out.println(類),它將默認為toString函數並打印那里指定的內容。 我想知道我是否可以在C ++中做類似的事情。 我也應該提一下,我不太擅長c ++,所以我的示例代碼可能會有很多錯誤。
class thing {
private:
char *foo;
public:
thing(){ foo="asd"; }
char* getString(){ return foo; }
friend ostream& operator<<(ostream &out, thing &abc);
};
template<typename T>
ostream& operator<<(ostream &out, T &abc){
out<<abc.getString();
return out; }
int main(){
thing test;
cout<<test;
return 0; }
我嘗試過幾種方法,但我總是遇到一些錯誤。
基本想法沒問題。 雖然,可以說你只是簡單地將依賴從“重載”轉移到擁有getString()
成員。 但是你應該通過const-ref傳遞。 此外,getString()應該是const。
這是您的代碼的工作版本,結合@Mooing Duck的SFINAE檢查
#include <iostream>
#include <ostream>
using namespace std;
class thing {
private:
const char *foo;
public:
thing(){ foo="asd"; }
const char* getString() const { return foo; }
};
template<typename T, class = decltype(std::cout<<std::declval<T>().getString())>
ostream& operator<<(ostream &out, T const &abc){
out<<abc.getString();
return out;
}
int main(){
thing test;
cout<<test << 3;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.