我可以创建模板运算符<<所有类都可以使用的重载? C ++

时间:2014-04-30 02:37:21

标签: c++ templates operator-overloading

如果我的问题令人困惑,我的意思是:

在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;  }

我试图通过几种方式做到这一点,我总是会遇到某种错误。

2 个答案:

答案 0 :(得分:2)

基本想法没问题。虽然,可以说,你只是简单地将依赖性转移到了&lt;&lt;&lt;&lt;&lt;&lt;&lt;拥有getString()成员的过载。但是你应该通过const-ref传递。此外,getString()应该是const。

答案 1 :(得分:1)

这是您的代码的工作版本,结合@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;
}

live demo