2016-03-14 81 views
2

我正在生成程序集,我想讓所有生成的代碼對齊。這包括在每條指令前面有像cout<<"\t"<<left<<setfill(' ')<< setw(8);這樣的東西。我怎麼能聲明一個ostream修飾符,這將節省我在每一行編寫所有這些代碼。我要尋找某事像:定義一個ostream修飾符C++

ostream mod="\t"<<left<<setfill(' ')<< setw(8); cout<<mod<<"addiu"<<"$sp, $sp, 24"<<endl;

我知道我可以用宏做到這一點,但我想知道我怎麼能與ostream的對象做到這一點。

+1

機械臂是「粘性」,這樣你就不需要不斷重複他們。 – Praetorian

+0

你誤讀'蒸汽'作爲'流'嗎? – user463035818

回答

1

流式傳輸一個函數並返回一個std::ostream&將在流上調用該函數。這是怎樣的一些標準操縱的定義,並創建自己的最快捷的方式,如果他們不需要帶任何參數:

namespace cds { 
std::ostream& pad(std::ostream& os) { 
    return os << '\t' << std::setfill(' ') << std::setw(8); 
} 
} 

int main() { 
    std::cout << cds::pad << "Hello" << '\n' 
       << cds::pad << "World" << '\n'; 
} 

打印:

$ ./SO 
     Hello 
     World 

尖的在評論中,你並不需要繼續重複setfill,但正如你不知道(從操作者的作者的角度來看)之間的什麼將被調用,你也可以。


而且,我解釋here,很多開發商,包括我自己,考慮使用endl一種不好的做法。

0

ostream定義接受流的功能operator<<過載,因此您可以輕鬆定義自己的操縱:

比`setw`其他
#include <iostream> 
#include <iomanip> 
using namespace std; 

ostream& foo(ostream& s) { 
    return s << hex << setw(4) << setfill('#'); 
} 

int main() { 
    cout << foo << 42; 
    return 0; 
}