我想知道是否有办法把它放在一条线上?
if (auto r = getGlobalObjectByName(word)) r->doSomething; // This works fine
if (!auto r = getGlobalObjectByName(word)) r->doSomething; // Says "expected an expression"
if (auto r = getGlobalObjectByName(word) == false) r->doSomething; // Also doesn't work.
Run Code Online (Sandbox Code Playgroud)
我也尝试用额外的括号围绕它,但这似乎不起作用.我发现这在一条线上非常方便.
Pas*_* By 49
从C++ 17开始,您可以使用初始化if语句:
if (auto r = getGlobalObjectByName(word); !r) r->doSomething;
Run Code Online (Sandbox Code Playgroud)
语义是:
if (init-statement; condition) statement
Run Code Online (Sandbox Code Playgroud)
与"传统"if语句的唯一区别是init-statement
,它初始化块作用域中的变量,类似于for循环.
Mar*_*ica 12
如果你有C++ 17,请使用if (init statement; condition)
表单.如果没有,您有三种选择:
不要试图将这一切保持在一条线上.例如:
auto r = getGlobalObjectByName(word);
if (!r) r->doSomething();
Run Code Online (Sandbox Code Playgroud)使用else
:
if (auto r = getGlobalObjectByName(word)) {} else r->doSomething();
Run Code Online (Sandbox Code Playgroud)(注意,这需要r
一个智能指针,该函数具有非常奇怪的语义operator bool()
.OTOH,我认为这实际上是一段简短的示例代码,而不是您的实际代码).
我想我只会使用else
表单,如果将所有内容保存在一行非常重要(例如,保留代码的表格格式).