2016-01-18 61 views
4

比方說,我有這樣的typedefC++的typedef一個std ::對,然後使用的typedef聲明地圖

typedef std::pair<std::string, uint32_t> MyType; 

然後,如果我也想用的MyType創建一個地圖,我該怎麼辦呢?

我不想再鍵入對喜歡兩種類型:

map<std::string, uint32_t> myMap; 

我想是這樣的:

map<MyType's first type, MyType's second type> myMap; 

有沒有辦法使用到那樣做我的typedef MyType而不是重新輸入類型?

回答

5

簡單...

std::map<MyType::first_type, MyType::second_type> myMap; 

coliru

+0

啊這就是你如何使用成員類型的類型..我嘗試使用點和箭頭操作符,並沒有工作......大聲笑非常感謝。 (需要等待2分鐘才能將其作爲答案) – whiteSkar

+0

但是它依賴於MyType作爲std :: pair。如果這是實際問題的簡化版本,OP將需要提出另一個問題(他們很可能會走運)。該語言沒有提供反思typedef的一般方法,必須依賴typedef類型爲此提供一種機制。 –

+1

@MartinBonner我的問題實際上是簡單的一對案件。 :) – whiteSkar

0

當你使用一對它相當於一個屬性見http://en.cppreference.com/w/cpp/utility/pair

示例程序。 Pair就像派生的數據類型。當您在地圖中使用一對時,它會被視爲基於您的聲明的關鍵字或值。但是一對的第一個和第二個對象不能是地圖中的鍵和值。您可以分別爲兩種數據類型使用typedef,並使用快捷方式或前面答案中提到的方法。不要反覆寫「std ::」,你可以用namespace std來使用 ;謝謝。

+0

你*可以*使用'使用命名空間標準;',但只是因爲你可以,並不意味着這是一個好主意..請參閱http://stackoverflow.com/questions/1452721/why-is-using-namespace -std-considered-bad-practice –

+0

我不知道。感謝您提供@MartinBonner的信息 –

3

如果你打算用很多不同的類型來做這件事,你可以設置一個別名聲明

template <typename T> 
using pair_map = std::map< typename T::first_type, typename T::second_type>; 

typedef std::pair<std::string, int> MyType; 

pair_map<MyType> my_map; 

這需要至少C++ 11。