使用自己的功能扩展 std::vector<std::pair<...>>

Extending std::vector<std::pair<...>> with own functionality

我的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<..>> 作为参数] 来遍历向量,但我认为当我可以使用我的 [ 扩展 std::vector 模板时会更优雅=17=] 函数检查 !strcmp(sParameter, it.first) 向量是否有请求的条目,然后 returns 然后 .second 值。

像这样:

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

暂时不需要检查该值是否存在。我想保持示例简单并专注于问题。

我的解决方案:

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));