2015-05-30 48 views
3

模板總是變得很漫長,當我有一定的載體和模板包含的對象,並最終看起來就像一堆> > > > > > >,幾乎沒有幫助辨別界限有時,像這樣:標準方式

std::vector< std::pair< std::string, std::set<std::string> > > 

有沒有一種標準的方法來減少長度,或使項目易於區分?我的實際代碼是這個類聲明。

我試過縮短函數名稱並輸入返回值。

class Event_Maker 
{ 
    public: 

     virtual ~Event_Maker() {}; 

     // this one         *this juts out really far v 
     virtual std::vector< std::unique_ptr<Event> > transfer_events(void) = 0; 
}; 
+1

'typedef' –

+0

一樣的:typedef的std ::矢量> Event_List; :D – user2738698

回答

4

是否有減少的長度,或使容易區分物品的標準方式?使用typedef

類型別名可以很方便的,例如:

typedef std::unique_ptr<Event> EventPtr; 
typedef std::vector<EventPtr> EventVector; 
virtual EventVector transfer_events(void) = 0; 

順便說一句,你只需要>>之間的空間,你不需要<後或>前:

std::vector<std::pair<std::string, std::set<std::string> > > 

UPDATE

由於@Snowhawk04@mkrieger1在評論中指出, 與現代編譯器,你不再需要>>之間的空間。 只要確保使用正確的編譯器標誌 ,例如-std=c++0xg++。 查看更多信息about >>template aliases

+1

你現在不需要''>''之間的空格嗎?現在不是''比'typedef'更喜歡使用'嗎? – mkrieger1

+0

'g ++'版本4.8.3需要空格。我不知道''使用'over'typedef'。 – janos

+1

C++ 11 addressing'>>'([link](http://en.wikipedia.org/wiki/C%2B%2B11#Right_angle_bracket))並擴展了'using'([link](http ://en.wikipedia.org/wiki/C%2B%2B11#Right_angle_bracket))。確保你使用C++ 11編譯('-std = C++ 0x') – Snowhawk

1

您也可以在返回類型後創建一個新行。這就是像Clang-Format這樣的格式化工具。

struct EventMaker { 
    virtual ~EventMaker() {}; 

    virtual std::vector<std::unique_ptr<Event>> 
    transfer_events() = 0; 
}; 

C++ 11還引入了尾返回型。有些人發誓在其預期用途之外討厭它。

struct EventMaker { 
    virtual ~EventMaker() {}; 

    virtual auto transfer_events() 
    -> std::vector<std::unique_ptr<Event>> = 0; 
}; 

不幸的是,返回類型是它與派生類合同的一部分,我們不能使用C++ 14的自動返回類型推演虛擬功能。

除非您打算編寫多語言代碼(即extern "C"{};),否則您可以省略void參數,這些函數不帶任何參數。

+0

把'return_val函數(void){// stuff}'真的只是我的一個習慣, b謝謝你的提示。 – user2738698

4

作爲一個附加的應答,在C++ 11可以使用using代替typedef,既完成同樣的事情:

//typedef pair<string, set<string>> pairStrSetStr; 
using pairStrSetStr = pair<string, set<string>>; 
vector<pairStrSetStr> vec;