この特定の状況でクラスに operator<< を作成する際に問題があります。私は std::ostream をラップするクラスを持っているので、ostream に渡す前にいくつかの型またはいくつかの条件に対して前処理を行うことができ、いくつかのものをそのまま渡したいと考えています。適切な議論がない限り、std::ostream を継承したくありません。(私は一度それを試みたと思いますが、非常に困難で成功しませんでした。)
場合によっては処理が型に依存するため、テンプレート関数を使用できません。また、テンプレート関数と特定の型 (「スタッフ」など) との間にあいまいさが残ると思います。typeid を使用する必要がありますか??
class MyClass
{
private:
std::ostream & m_out;
public:
MyClass (std::ostream & out)
: m_out(out)
{}
MyClass & operator<< (const Stuff & stuff)
{
//...
// something derived from processing stuff, unknown to stuff
m_out << something;
return *this;
}
// if I explicitly create operator<< for char, int, and double,
// such as shown for char and int below, I get a compile error:
// ambiguous overload for 'operator<<' on later attempt to use them.
MyClass & operator<< (char c)
{
m_out << c; // needs to be as a char
return *this;
}
MyClass & operator<< (int i)
{
if (/* some condition */)
i *= 3;
m_out << i; // needs to be as an integer
return *this;
}
// ...and other overloads that do not create an ambiguity issue...
// MyClass & operator<< (const std::string & str)
// MyClass & operator<< (const char * str)
};
void doSomething ()
{
MyClass proc(std::cout);
Stuff s1, s2;
unsigned i = 1;
proc << s1 << "using stuff and strings is fine" << s2;
proc << i; // compile error here: ambiguous overload for 'operator<<' in 'proc << i'
}