C++標準庫筆記:13.6 操控器

操控器是什麼

std::cout << std::endl;此句代碼中std::endl爲操控器,操控器是用來操控stream對象的,常常只會改變輸入或格式化輸出的解釋方式。

  • std::cout << std::endl:輸出’\n’,並刷新output緩衝區
  • std::cout << std::ends:輸出’\0’
  • std::cout << std::flush:刷新output緩衝區
  • std::cin >> std::ws >> strTemp: 讀入並忽略空格

其中std::ws格外給個測試例子(^-^)

    //ws是一次性的,執行了任意格式化io操作後,就恢復默認值  
    char strTemp[16] = { 0 };
    std::cin >> std::ws;
    while( std::cin.getline( strTemp, sizeof(strTemp) ) )
    {
        cout << strTemp << endl;
        std::cin >> std::ws;
    }

操控器運行原理

操控器是一個特定格式的函數,而stream以這個特定格式函數爲參數重載了相應的格式操作符<< 、>>。如std::cout << std::endl;,操作符執行時,碰到std::endl,則以參數std::endl調用相應的<<重載函數(此處叫操控器)。

operator<<實現代碼片斷:

_Myt& __CLR_OR_THIS_CALL operator<<(_Myt& (__cdecl *_Pfn)(_Myt&))
{   // call basic_ostream manipulator
    _DEBUG_POINTER(_Pfn);
    return ((*_Pfn)(*this));
}

endl的實現代碼片斷:

template<class _Elem,
    class _Traits> inline
    basic_ostream<_Elem, _Traits>&
        __CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{   // insert newline and flush stream
    _Ostr.put(_Ostr.widen('\n'));
    _Ostr.flush();
    return (_Ostr);
}

自定義操控器

知道了操控器的運行原理,只要按其格式寫個函數就行,以下是個輸出hello的操控器例子

template<class T, class traits> 
inline basic_ostream<T, traits>& out_hello(basic_ostream<T, traits>& os )
{   
    char szTemp[] = "hello";
    os.write( szTemp, sizeof(szTemp) );
    return os;
}


int main()
{
    cout << out_hello << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章