扩展std :: vector <std :: pair <...>&gt;具有自己的功能

时间:2015-05-09 16:33:24

标签: c++11 vector std-pair

我的C ++ 11太弱而无法找到解决方案。我的项目中有很多std::vector<std::pair<const char *, int>>变量,因此检查条目是否存在的代码重复:

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<..>>作为参数],它遍历向量,但我认为当我可以使用{{1}扩展std::vector模板时会更优雅如果向量具有请求的条目并返回find_member()值,则检查!strcmp(sParameter, it.first)的函数。

这样的事情:

.second

目前无需检查该值是否存在。我想让这个例子保持简单并专注于这个问题。

1 个答案:

答案 0 :(得分: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));