2015-05-09 54 views
0

My C++ 11太弱,無法找到解決方案。我有很多在我的項目std::vector<std::pair<const char *, int>>變量,因此代碼的檢查,如果一個條目存在重複:使用自己的功能擴展std :: vector <std :: pair <...>>

std::vector<std::pair<const char *, RunningProgramMode>> vProgramMode = 
{ 
    { "server", RunningProgramModeServer }, 
    { "shell", RunningProgramModeShell }, 
    { "client", RunningProgramModeClient }, 
}; 

// the following code repeats for each variable 
for (auto const &it : vProgramMode) 
{ 
    if (!strcmp(sParameter, it.first)) 
    { 
     programParameters->requestedProgramMode = it.second; 
    } 
} 

當然,我可以寫一個函數[接收std::vector<std::pair<..>>作爲參數]通過矢量,但我這迭代認爲它可以更優雅,當我可以擴展std::vector模板與我的find_member()功能,該功能與!strcmp(sParameter, it.first)檢查矢量是否有請求的條目並返回.second值。

事情是這樣的:

std::my_vector<std::pair<const char *, RunningProgramMode>> vProgramMode = 
{ 
    { "server", RunningProgramModeServer }, 
    { "shell", RunningProgramModeShell }, 
    { "client", RunningProgramModeClient }, 
}; 
result = vProgramMode.find_member("shell"); 

就目前而言,沒有必要檢查值確實存在。我想保持簡單的例子並專注於問題。

+0

不,你不能添加一個成員函數標準類型。 – cpplearner

+1

'find_member(vProgramMode,「shell」)'是完全相同的字符數,並且具有額外的好處,它實際上可能(並且直接)實現,並且不涉及一廂情願。無論如何,對於你的數據結構,你可能更喜歡'std :: map '。 –

回答

0

我的解決辦法:

template<typename T> 
class MyVectorForPair 
{ 
private: 
    std::vector<std::pair<const char *, T>> classObject; 
public: 
    MyVectorForPair(std::vector<std::pair<const char *, T>> initVector) 
        { classObject = initVector; } 
    auto find_member(const char * sMember, T defaultReturn) -> T; 
}; 

template<typename T> 
auto MyVectorForPair<T>::find_member(const char * sMember, T defaultReturn) -> T 
{ 
    for (auto const &it : classObject) 
    { 
     if (!strcmp(sMember, it.first)) 
     { 
      return it.second; 
     } 
    } 
    return defaultReturn; 
} 

我可以使用它,然後這樣的 - 現在是一般:

MyVectorForPair<RunningProgramMode> vProgramMode 
(
    { 
     { "server", RunningProgramModeServer }, 
     { "shell", RunningProgramModeShell }, 
     { "client", RunningProgramModeClient }, 
    } 
); 

RunningProgramMode result; 
result = vProgramMode.find_member(sParameter, RunningProgramModeNotSelected)); 
相關問題