В качестве альтернативы исключениям вы также можете возвращать строку по ссылке в списке аргументов и указывать успех, возвращая истину или ложь, т.е.
bool GetWindowText(HWND handle, std::wstring& windowText)
{
const int size = 1024;
TCHAR wnd_text[size] = {0};
HRESULT hr = ::GetWindowText(handle,
wnd_text, size);
if(SUCCEEDED(hr))
{
windowText = wnd_text;
return true;
}
else
return false;
}
Другая альтернатива, которая избегает ссылочного аргумента, - это возвращение экземпляра класса, который переносит значение, но также позволяет узнать, присутствует ли значение, например,
class ValueWrapper
{
public:
ValueWrapper() : present( false ) {}
ValueWrapper( const std::wstring& s ) : value( s ), present( true ) {}
bool isPresent() const { return present; }
const std::wstring& getValue() const { return value; }
private:
std::wstring value;
bool present;
};
Обратите внимание, что вы можете легко создать шаблон для этой оболочки. Ваша функция будет тогда
ValueWrapper GetWindowText(HWND handle)
{
const int size = 1024;
TCHAR wnd_text[size] = {0};
HRESULT hr = ::GetWindowText(handle,
wnd_text, size);
if(SUCCEEDED(hr))
return ValueWrapper( wnd_text );
else
return ValueWrapper();
}