我發現自己寫身邊空調風格的API的C++包裝相當頻繁,浪費代碼我寫了一個公共位是這樣的:填充的std ::直接從C API的字符串
//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
@tadman - 未開啓?有'boost :: optional'。而且即將在這裏'std :: optional'。 – StoryTeller
@StoryTeller哦,很高興看到。我的意思是「開放」,就像在Swift的隱式解包語義中使用'!'一樣。也許「理想」是一個更好的詞。 – tadman