LINUX.ORG.RU

[C++] Использование параметризирующих манипуляторов в самодельном классе

 


0

0

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

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

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

Может быть унаследовать от класс std::stringstream?

Можно так:
class MyCoolClass: public std::stringstream {...};

Или так:
class MyCoolClass: private std::sringstream
{
public:
using std::sringstream::operator<<; // разрешаем использовать operator<< из вне
};

Devix
()
Ответ на: комментарий от yoghurt

Код в студию

Ну, там что-то вроде:

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? Я не знаю. */
};
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от legolegs

Здесь, по идее, должен сработать автовывод типов? Я правильно понял идею?

one_more_hokum ★★★
() автор топика

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

Вы имели в виду что-то типа такого?

   template <typename Ty>  
   bool from_string( 
      Ty& t_out, const std::string& string_in, 
      std::ios_base& (*base_to)(std::ios_base&) = std::dec 
      ) { 
         std::istringstream iss(string_in); 
         return !( iss >> base_to >> t_out).fail(); 
   } 
 
   template <typename Ty>  
   bool to_string( 
      std::string& string_out, Ty& t_in,  
      std::ios_base& (*base_to)(std::ios_base&) = std::dec 
      ) { 
         std::ostringstream oss; 
 
         oss << base_to << t_in; 
         string_out = oss.str(); 
 
         return true; 
   } 
shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.