簡體   English   中英

我可以創建一個模板運算符<< overload,所有類都可以使用嗎? C ++

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

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