允许赋值或存在当前函数的宏

Macro that allows assignment or exists the current function

我希望能够实现:

#define GET_VALUE_OR_RETURN(value, expect) do { if (expect.valid()) \
        { value = move(expect.get()); } else return expect.get_error();break;} while(0)

expect 是一个 class 实例,它具有宏中使用的成员。如果 valid() 为假,我所做的是从当前函数 return 否则检索值。

通过使用定义的宏,我有这样的用法语法:

auto expect = CreateInstance(someData);
ResultType result;
GET_EXPECTED_VALUE_OR_RETURN(result, expect);

使用此语法的缺点是我必须在使用宏之前默认初始化 ResultType,并且仅使用 2 行代码才能使用有效值初始化我的变量。有更好的东西吗?

如果您愿意将宏扩展为多个语句,这里有一个解决方案:

#define GET_VALUE_OR_RETURN(value, expect) \
  if (!(expect).valid()) return (expect).get_error(); \
  value = move((expect).get())

使用:

auto expect = CreateInstance(someData);
GET_VALUE_OR_RETURN(ResultType result, expect);

鉴于您实际上希望宏声明一个变量,因此不太可能在 if/else 分支中使用它 "unprotected";因此,缺失的 dowhile 并不重要。

您甚至可以更进一步:

#define GET_VALUE_OR_RETURN(type, value, expect) \
  auto &&value ## SuffixToPreventNameConflicts = (expect); \
  if (!(value ## SuffixToPreventNameConflicts).valid()) return (value ## SuffixToPreventNameConflicts).get_error(); \
  type value = move((value ## SuffixToPreventNameConflicts).get())

// Used like

GET_VALUE_OR_RETURN(ResultType, result, CreateInstance(someData));

或更进一步,通过从参数中删除 type 并在第二个声明中使用 auto

请注意 SuffixToPreventNameConflicts 不是占位符;它可以从字面上理解。由于变量的名称是基于 value,因此不会发生使用宏本身的口是心非(因为它无论如何都会发生在结果变量上)。后缀的存在只是为了防止与同一范围内的其他不相关变量发生意外冲突。