的任何系统定义的用户类型过去的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一个类型的对象呢?
重新阅读您的问题(如本评论的结果后回答 )我已经意识到,你想要的不仅是转换成字符串(我在对方的回答假设在这里 ),而是转发到内部ofstream的。
现在,你想达到什么是不简单,并且可以在大多数情况下矫枉过正。 在执行[make_string][3]
我有(即转发到内部ostringstream
),I不允许被传递操纵器。 如果用户想添加一个新行(我们linux下的开发),他们只是通过一个“\ n”字符。
你的问题是转发操纵( std::hex
, std::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
在该特定情况下)
的i仅具有一个重载操作方法与一个参数(如无效*),然后该方法内决定如何强制转换整数为char *
不,你不能。 一个void *没有携带类型的信息,所以没有制定什么类型它实际指向的方式。
只有一个重载函数。 它并不需要一个void *
,因为那将是无用的。 如果需要一种数据类型,它不过载,并且它只能看到输入值它被转换成型后。 这意味着您对如何转换,说,一个没有控制int
。
如果你想之间,比方说,一个不同的行为int
和char *
,你需要让函数知道在某种程度上它是什么类型饶人,你需要传递的价值。这是一个重载或模板函数做什么。
在<<运算符重载为每一个类型?
是
有没有办法只通过一个通用的重载函数来实现呢?
这个问题是没有意义的..你想只是一个功能,或者你想要一个重载函数?