Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Использование параметризирующих манипуляторов


Автор: EnergoHokum 14.5.2010, 06:48
В самодельный класс инкапсулирован std::stringstream. Хочется, чтобы к данному классу можно было применять все манипуляторы. Но вот с параметризующими манипуляторами (std::setioflags, std::setbase, std::setfill, std::setprecision, std::setw) у меня выходит непонимание.

Как пример: std::setw вот http://cplusplus.com/reference/iostream/manipulators/setw/ имеет возвращаемый параметр smanip. Покопавшись в исходниках iostream выяснил, что это -- вообще структура с произвольным именем (у GCC своё, у MSVS своё).

Как организовать передачу таких манипуляторов std::stringstream-у?

Сам класс выглядит наподобие

Код

template <typename T> 
class Foo 
{ 
private: 
 typedef std::ios_base& (*iomp) (std::ios_base&); 
 std::stringstream sstr; 
public: 
 inline std::ios_base& operator << (iomp mp) 
 { return (sstr << mp); } 
 /* А вот что typedef-ать для, например, setfill? Я не знаю. */ 
};

Автор: GoldFinch 14.5.2010, 08:15
EnergoHokum, посмотрите как сделан ostream

---------
фразу про typedef не понял %)
там шаблон надо применять, т.к. там не указатель на функцию, а функтор

Автор: EnergoHokum 14.5.2010, 08:49
Цитата

посмотрите как сделан ostream


То есть, классу надо приделать 6 функций, каждая под отдельный манипулятор?
В <iomanip> GCC, по крайней мере, это выглядит так.

Код

  extern template ostream& operator<<(ostream&, _Setfill<char>);
  extern template ostream& operator<<(ostream&, _Setiosflags);
  extern template ostream& operator<<(ostream&, _Resetiosflags);
  extern template ostream& operator<<(ostream&, _Setbase);
  extern template ostream& operator<<(ostream&, _Setprecision);
  extern template ostream& operator<<(ostream&, _Setw);


Цитата

там шаблон надо применять, т.к. там не указатель на функцию, а функтор 


Отчего же функтор? И std::showpos (например), и std::setfill -- функции. Только манипуляторы базовыми флагами формата принимают и возвращают вполне себе ссылки на потоки ввода-вывода, а у параметризующих манипуляторов возвращаемое значение -- unspecified.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)