如何ofstream的或ostream的类型转换所有类型为字符串?(how does ofstrea

2019-06-26 01:28发布

的任何系统定义的用户类型过去的ostream对象被转换为一个字符串或字符*?

喜欢的cout << 4 << “Hello World” 的;

工作完全正常,这是怎么实现的呢? 在<<运算符重载为每一个类型? 有没有办法只通过一个通用的重载函数来实现呢? 我的意思是,我可以只有一个重载操作方法有一个参数(如无效*),然后该方法内决定如何强制转换整数为char *

物联网部分的工作,如果我重载operator <<使用模板即

class UIStream
{
private:
 ofstream stream;
public:
 UIStream();
 ~UIStream();
 template <typename T>
 UIStream& operator << (const T);
};

所以此工程

 UIStream my_stream;
 my_stream<<"bcd"<10;

但它会产生编译错误,当我做到这一点

my_stream <<endl;

错误C2678:二进制“<<”:没有操作员发现这需要类型的左边的操作数“UIStream”(或没有可接受的转化率)

是不是标准:: ENDL一个类型的对象呢?

Answer 1:

重新阅读您的问题(如本评论的结果后回答 )我已经意识到,你想要的不仅是转换成字符串(我在对方的回答假设在这里 ),而是转发到内部ofstream的。

现在,你想达到什么是不简单,并且可以在大多数情况下矫枉过正。 在执行[make_string][3]我有(即转发到内部ostringstream ),I不允许被传递操纵器。 如果用户想添加一个新行(我们linux下的开发),他们只是通过一个“\ n”字符。

你的问题是转发操纵( std::hexstd::endl ...)。 您的运营商<<被定义为取一个类型T的恒定实例,但操纵的函数指针和编译器不能匹配它的方法。

机器人是对操作功能std::basic_ostream模板。 该basic_ostream模板和ostream类定义如下:

template <typename TChar, typename TTraits = char_traits<TChar> >
class basic_ostream;

typedef basic_ostream<char> ostream;
// or
// typedef basic_ostream<wchar_t> if using wide characters

然后可以传递到一个std :: ostream的可能的操纵器:

typedef std::ostream& (*manip1)( std::ostream& );

typedef std::basic_ios< std::ostream::char_type, std::ostream::traits_type > ios_type;
typedef ios_type& (*manip2)( ios_type& );

typedef std::ios_base& (*manip3)( std::ios_base& );

如果你想接受操纵你必须提供你的类重载:

class mystream
{
//...
public:
   template <typename T> 
   mystream& operator<<( T datum ) {
      stream << datum;
      return *this
   }
   // overload for manipulators
   mystream& operator<<( manip1 fp ) {
      stream << fp;
      return *this;
   }
   mystream& operator<<( manip2 fp ) {
      stream << fp;
      return *this;
   }
   mystream& operator<<( manip3 fp ) {
      stream << fp;
      return *this;
   }
};

尤其对于ENDL签名(这可能是你需要的唯一一个)是:

template <typename Char, typename Traits>
std::basic_ostream<Char,Traits>& 
   std::endl( std::basic_ostream<Char,Traits>& stream );

所以它落在下manip1类型的功能。 其他人,如std::hex不同类别下下降( manip3在该特定情况下)



Answer 2:

的i仅具有一个重载操作方法与一个参数(如无效*),然后该方法内决定如何强制转换整数为char *

不,你不能。 一个void *没有携带类型的信息,所以没有制定什么类型它实际指向的方式。



Answer 3:

只有一个重载函数。 它并不需要一个void * ,因为那将是无用的。 如果需要一种数据类型,它不过载,并且它只能看到输入值它被转换成型后。 这意味着您对如何转换,说,一个没有控制int

如果你想之间,比方说,一个不同的行为intchar * ,你需要让函数知道在某种程度上它是什么类型饶人,你需要传递的价值。这是一个重载或模板函数做什么。



Answer 4:

在<<运算符重载为每一个类型?

有没有办法只通过一个通用的重载函数来实现呢?

这个问题是没有意义的..你想只是一个功能,或者你想要一个重载函数?



文章来源: how does ofstream or ostream type cast all types to string?