我正在处理一个小的命令处理器项目,在实现参数列表时,我希望能够从一个方法返回nullptr,否则该方法将返回一个无符号的int。
我对C/C++思维方式相对较新(主要使用.NET,Java,Python和其他托管语言)
我想出了以下方法:
unsigned int* GetUnsigned(char* paramName, unsigned int* defaultValue = nullptr) {
std::string name(paramName);
if(this->Exists(name)) {
unsigned int tmp = (unsigned int)std::stoul(this->mParams[name], nullptr, 10);
unsigned int *value = (unsigned int*)malloc(sizeof(unsigned int));
memcpy(value, &tmp, sizeof(unsigned int));
return value;
}
return defaultValue;
}
它完成了工作,但对我来说似乎有点奇怪,仍然。
这被认为是一种不好的做法还是正确的做法?
正如科里和你们所有人所建议的那样:std::optional
做到了。 另外,正如 m88 所建议的那样:我已经用.value_or(value)
替换了我的第二个参数,如果列表中缺少给定的参数键,这将是默认返回值。
现在当前的实现如下所示:
std::optional<unsigned int> GetUnsigned(const char* paramName) {
if(this->Exists(paramName)) {
return (unsigned int)std::stoul(this->mParams[paramName], nullptr, 10);
}
return {}; // Returning an empty optional
}
用法如下:
void testFunc(CommandParameterList* params, ResponseBuilder* rbuilder) {
/* ... */
unsigned int value = params->GetUnsigned("Param2").value_or(100);
/* ... */
}