使用自己的功能扩展 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));
我的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));