Возможно ли вложение перегруженных операторов? Я хотел бы вложить << внутри ()

template<class T>
struct UnknownName
{
   T g;
   T&operator<<(std::ostream&os, const T&v){return os<<v;}
   bool operator()(const T&v)
   {
      if(v==g)
        //do the streaming << then return true
      else return false;
   }
};

Не могли бы вы мне помочь? Боюсь, мой пример для вас достаточно нереален, просто спросите, остались ли у вас сомнения. Искренне.

c++
0
Baby Dolphin 27 Авг 2011 в 02:35

2 ответа

Лучший ответ

Лучшее, что я могу придумать, - это чтобы operator<< возвращал определенный тип, а затем перегружал operator(), чтобы принять этот тип:

#include <cstdio>

namespace {
    struct Foo {
        struct Bar {
            int i;
        };

        Foo& operator()(const Bar& b)
        {
            std::printf("bar, %d\n", b.i);
            return *this;
        }

        // obviously you don't *have* to overload operator()
        // to accept multiple types; I only did so to show that it's possible
        Foo& operator()(const Foo& f)
        {
            std::printf("foo\n");
            return *this;
        }
    };

    Foo::Bar operator<<(const Foo& f, const Foo& g)
    {
        Foo::Bar b = { 5 };
        return b;
    }
}

int main()
{
    Foo f, g, h;
    f(g << h);
    f(g);
}

Это не обычная идиома, мягко говоря.

0
Max Lybbert 27 Авг 2011 в 00:01

Я не могу точно сказать, о чем вы спрашиваете, но я предполагаю, что вы имеете в виду написать класс для ostream&, который передается в operator<<. Сначала вы должны придумать способ преобразования T в строковое представление. Я предполагаю, что это делает функция TToString.

template<class T>
struct UnknownName
{
   T g;

   bool operator()(const T&v)
   {
      if(v==g) {
        cout << v;
        return true;
      }

      return false;
   }

   friend std::ostream& operator<<(std::ostream& os, const T& v) {
      return os << TToString(v);
   }
};

Извините, если я неверно истолковал ваш вопрос.

1
Seth Carnegie 26 Авг 2011 в 22:45