1

この特定の状況でクラスに 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'
}
4

2 に答える 2

0

型によって処理が異なる場合がありテンプレート関数が使えない

それらの型のオーバーロードを作成するだけです。

それと私の特定のタイプ(「もの」など)の間のあいまいさは残ると思います。

いいえoperator<<。 が特定の型に対してオーバーロードされている場合、このオーバーロードが呼び出されます。それ以外はテンプレート関数と呼ばれます。

template <class T>
MyClass& operator<< (const T& t)
{
    m_out << t;
    return *this;
}
于 2013-05-01T13:15:11.010 に答える