C++ 我可以制作一个模板操作符吗<&书信电报;所有类都可以使用的重载?C++;

C++ 我可以制作一个模板操作符吗<&书信电报;所有类都可以使用的重载?C++;,c++,templates,operator-overloading,C++,Templates,Operator Overloading,如果我的问题令人困惑,我的基本意思是: 在java中,如果您使用System.out.println(类),它将默认为toString函数,并打印其中指定的内容。我想知道我是否可以在C++中做类似的事情。我也应该提到我不太擅长C++,所以在我的示例代码中可能有很多错误。 class thing { private: char *foo; public: thing(){ foo="asd"; } 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;  }
类的东西{
私人:
char*foo;
公众:
thing(){foo=“asd”;}
char*getString(){return foo;}

friend ostream&operator基本思想还可以。不过,可以说您只是简单地将依赖性从代码的工作版本转移到了,再加上@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;
}
#包括
#包括
使用名称空间std;
阶级事务{
私人:
const char*foo;
公众:
thing(){foo=“asd”;}
常量char*getString()常量{return foo;}
};

模板
thing test()
至少是请输入的!为什么您同时拥有
getString
操作符?看起来您正在尝试替换
。此外,使用
std::string to_string(const my_class_type&)更为正常< /C>作为一个自由函数。它们被添加到标准C++中。通过const REF可以消除错误吗?我会返回常量还是让函数常量?你的代码编译给我(虽然有一个字符串字符串警告)当我删除friend decl时。这比模板更可取。如果希望它对const对象起作用,则需要传递const ref。在这种情况下,getString也需要是const。现在应该添加
const
@MooingDuck happy?为什么getString()需要两个重载?@user3521733它不是必需的。@user3521733为什么?
enable_如果
需要一个
bool
值条件,你想要什么条件?除非你想创建一个助手类
有\u getstring