2015-05-09 53 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)); 
相关问题