Проверка возвращаемого результата
Есть такая функция
HRESULT convert(type1 from, type2 &to) {
.......
}
Вызывается она всегда в таком виде
type2 val2;
HRESULT res = convert(val1, val2);
if (res != S_OK)
return res;
// Using val2
хочется ее во что-то обернуть, чтобы вызов выполнялся по такой схеме
type2 val2 = WRAP_CONVERT(val1);
где WRAP_CONVERT что-то типа такого
#define WRAP_CONVERT(x) type2 a; \
HREULT res = convert(x, a); \
if (res != S_OK) return res; \
a
но значение a так возвратить не получится, а двойное использование такого макроса приводит к повторному объявлению переменных
Ответы (2 шт):
Автор решения: Harry
→ Ссылка
type2 WRAP_CONVERT(type1 from)
{
type2 to;
if (convert(from, to) != S_OK) throw(.....);
return to;
}
Так? Исключение - сами допишите, какое нужно...
pair<type2, HRESULT> WRAP_CONVERT(type1 from)
{
type2 to;
pair<type2, HRESULT> r;
r.second = convert(from, to);
r.first = to;
return r;
}
Для тех, кто не понимает, что значит обработка ошибок и что такое С++...
type2 WRAP_CONVERT(type1 from)
{
type2 to;
convert(from, to);
return to;
}
Автор решения: Николай Алексеевич Терехов
→ Ссылка
Думаю лучше передавать в WRAP_CONVERT название переменной var2
#define WRAP_CONVERT(x, var2) type2 var2; \
HRESULT res = convert(x, var2); \
if (res != S_OK) return res;
или (чтобы ; обязательно было ставить после WRAP_CONVERT(...) )
#define WRAP_CONVERT(x, var2) \
type2 var2; \
do { \
HRESULT res = convert(x, var2); \
if (res != S_OK) return res; \
} \
while(false) \
Тогда вызывать можно так
WRAP_CONVERT(val1, val2);
\\ использование val2
\\ ...
return val2;