模糊的C ++运算符重载

时间:2015-11-28 12:13:32

标签: c++ operator-overloading

我有以下代码:

#include <iostream>

using namespace std;

ostream& f(ostream& os) {
    return os << "hi";
}

int main() {
    cout << "hello " << f << endl;
    return 0;
}

不知怎的,这是有效的 - 输出是&#34;你好嗨#34;。这是如何被编译器解释的?我不明白如何将函数插入到流中。

2 个答案:

答案 0 :(得分:30)

signal 11 [Segmentation fault]有一个std::ostream重载,它接收一个带有签名的函数的指针,例如你写的那个(number 11 in this list):

operator<<

只调用给定的函数将自身作为参数传递。这个重载(以及几个类似的其他)允许你实现流操纵器,即你在流中输出basic_ostream& operator<<( std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) ); 的东西,并从那里改变流的状态。例如,我们的(错误的)无处不在的<<版本可以实现为

std::endl

然后可以完全用作&#34;常规&#34; std::ostream &myendl(std::ostream &s) { s<<'\n'; s.flush(); return s; }

std::endl

(实际的实现是模板化的,有点复杂,因为它甚至可以在广泛的流中工作,但你明白了)

答案 1 :(得分:8)

public ActionResult CreateAdminItemsViewModel(int Typeid, int FormId) { ViewBag.formid = FormId; Type myType1 = Type.GetType("RadioButtonListViewModel"); BaseViewModel c= myType1; // doesn't work return PartialView("CreateAdminItemsViewModel", instantiationType); } 有一个重载,它接受一个函数作为参数;并且该重载的主体是调用给定的函数。

这正是std::ostream::operator<<实际上是如何运作的。 endl实际上是一个类似于:

的函数
endl