【发布时间】:2017-10-21 19:52:40
【问题描述】:
我发现自己经常围绕 C 风格的 API 编写 c++ 包装器,而且我编写的一些常见的浪费代码是这样的:
//getSomeString() wraps C api that gets some C string from somewhere
std::string MyClass::getSomeString()
{
char buffer[BUFFER_MAX];
memset(buffer, '\0', BUFFER_MAX);
auto result = GetCApiString(buffer, BUFFER_MAX); //C style string getter
return (result == NO_ERROR) ? std::string{buffer} : ""; //Copy here
}
但我真的很想做这样的事情:
//getSomeString(): as before
std::string MyClass::getSomeString()
{
DirectStringFillIterator<char> returnString; // <--HERE. Is something like this possible?
auto result = GetCApiString(returnString, BUFFER_MAX);
return (result == NO_ERROR) ? returnString.str() : "";
}
这样的事情可能吗?
【问题讨论】:
-
如果您要包装返回
NULL的 C 代码,通常最好将 C 错误映射到 C++ 异常。这避免了必须返回垃圾空字符串。在 Rust 或 Swift 等其他语言中,您可以将结果封装为“可选”,您可以在其中测试它是否包含值,但 C++ 对此类概念确实不那么开放。 -
@tadman - 未打开?有
boost::optional。很快就会在这里std::optional。 -
@StoryTeller 哦,很高兴看到。我的意思是“开放”,就像 Swift 的隐式展开语义中的
!。也许“理想”是一个更好的词。 -
@Jodocus:这将如何解决任何问题?如果你有一个本地缓冲区返回一个
string_view给它只会打开未定义行为的大门......