2017-02-09 75 views
0

我正在尝试为我的stream类实现一个操纵器。我对操纵器不太了解,但我认为我做的都是正确的。代码的相关部分如下:如何正确实现C++流操作符endl?

class stream 
{ 
public: 
    stream& operator<<(bool b) { // send bool value and return *this; } 
    stream& operator<<(const char str[]) { // send string and return *this } 
}; 

inline stream& endl(stream& s) 
{ 
    return s << "\r\n"; 
} 


class stream stream; 

int main() 
{ 
    stream << endl; 
} 

我不知道我在做什么错的,但不是调用endl编译器在调用stream::operator<<(bool)。任何想法?

+0

你的'endl'是一个函数而不是一个对象。 –

+0

是的。怎么了? – rrd

+0

所以'endl'实际上是一个指向函数*的指针(例如一些数字,如0x3758fd ..),因此只能在您的情况下将数字转换为'bool',以便选择过载。 (请看@ nwp的回答以作澄清) –

回答

5

查看stream << endl;编译器必须从您提供的operator <<中选择一个过载。 endl不可转换为const char *,但它可转换为bool,这就是您所得到的。

你可能意味着添加一个过载

stream& operator<<(stream &(*function)(stream &)) { 
    return function(*this); 
} 

class stream正确处理函数指针内。

1

由于您endl既不是bool也不是const char[](它是一个免费的功能),它被隐式转换为booltrue)和下面的函数调用:

stream::stream& operator<<(bool b) 

您可以定义endl是一种特殊类型的endl_t并确定它的正确操作:

#include <iostream> 
#include <string> 
#include <array> 

//Just make the operators `explicit`. See [this excellent answer on SO](http://stackoverflow.com/a/8239402/5470596). 

class stream 
{ 
public: 
    stream& operator<<(bool b) { std::cout << "bool\n" ; return *this; } 
    stream& operator<<(const char str[]) { std::cout << "const char[]\n" ; return *this; } 
}; 

struct endl_t {} endl; 

stream& operator<<(stream& s, endl_t) 
{ 
    s << "\r\n"; 
    return s; 
} 


int main() 
{ 
    stream s; 
    s << endl; // prints "const char[]" 
} 

Live on coliru