我的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
目前无需检查该值是否存在。我想让这个例子保持简单并专注于这个问题。
答案 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));