2013-04-15 2 views
1

У меня есть пользовательский класс под названием потокНастройка станд :: io_base флаги для пользовательского потока класса

class Stream 
public: 
    Stream& operator<<(int i) { stream_ << i; return *this;} 
      template <typename CustomClass> 
      Stream& operator<<(const CustomClass& c) { stream_ << c.toString() /* assume this template always have toString(); return *this; } 
private: 
    std::stringstream stream_; 
}; 

Это очень простой пример того, что я на самом деле есть. И я пытаюсь установить флагов std :: ios_base следующим образом:

Stream() << 1 << std::hex << 2; 

с использованием оператора;

Stream& operator<<(std::ios_base& b) { stream_.setf(b.flags()); return *this; } 

от того, что я понимаю, потому что станд :: шестигранной возвращает зЬй :: ios_base поэтому он должен назвать это и установить флаг потоков. Но он всегда вызывает шаблон. Примечание. Если я удалю этот шаблон, все будет так же хорошо, как и следовало ожидать, но есть ли способ иметь и то и другое?

Пожалуйста, не стесняйтесь спрашивать дальше, если вам нужно больше разъяснений

+0

Просто чтобы прояснить немного больше, что я пытаюсь это сделать ** ios_base ** перегруженный оператор важно над шаблоном. Я считаю, что это очень странное поведение, так как шаблоны следует ставить в крайнем случае, если во время компиляции его нельзя было бы разрешить другим типом. и я считаю, что std-библиотека связана перед всеми другими библиотеками. – abumusamq

+0

Кстати, даже если я возвращаю 'std :: ios_base &' и возвращать поток, это не делает работу, я имею в виду, что она все еще вызывает шаблон над типизированной перегрузкой – abumusamq

ответ

0

IOStream манипуляторы не являются объектами типа std::ios_base, они являются функциями, которые принимают и возвращают std::ios_base ссылки. Поэтому, когда вы хотите сделать вставку потока относительно этих объектов, вы должны перегрузить для указателей на функции:

Stream& operator<<(std::ios_base& (*manip)(std::ios_base&)) 
//     ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ 
{ 
    manip(this->stream); 
    return *this; 
} 
Смежные вопросы