- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
应用程序有一个日志系统,允许在运行时启用或禁用其模块的日志功能。日志命令接受输入流(作为“sprintf”的安全替代方案;几乎没有比调试系统导致崩溃更烦人的情况了。
问题是,如果我执行以下操作:
logger.Trace << "Requests pending:" << buffer.findRequests();
和findRequests()
具有高计算复杂性,即使禁用模块的 Trace 日志级别,搜索也会在 Trace 中被拒绝之前执行(在组装流时)operator<<
方法。
明显的替代方法是在代码中乱加:
if(logger.Trace.Enabled()) logger.Trace << ...
它不漂亮,也不舒服。我可以使用 if
将其替换为宏,或使用 &&
的一个短路,更好一些(可以用作 RValue,遵循 Stream 哲学在禁用流上返回 bool false):
#define TRACE if(logger.Trace.Enabled()) logger.Trace
#define TRACE dummyLogVar = logger.Trace.Enabled() && logger.Trace
两者都不是特别漂亮或安全。一位同事建议关闭:
logger.Trace([&](f){f << "Requests pending:" << buffer.findRequests();});
.Trace
仅当启用该级别时才会评估闭包。从逻辑上讲,这很好,但在语法上绝对可怕。输入乱码:logger.Trace([&](f){f <<
... ;});
几百次?
有没有更简洁、安全和舒适的方法来防止对流进行评估?
最佳答案
确实可以使用宏,但是您需要将输出作为参数的类似函数的宏,并且您需要确保它是单个语句。
第二部分,确保宏主体是单个语句,这很容易,通常使用 do { ... } while (false)
来完成。
只要参数中没有逗号,对宏使用参数也不难。逗号限制包括在宏参数中使用带有自己参数的函数调用,预处理器非常愚蠢,任何在宏参数中使用 any 逗号作为宏参数的分隔符。
在其最简单的形式中,不考虑逗号限制,宏可能看起来像
#define TRACE(output) \
do \
{ \
if (logger.Trace.Enabled()) \
{ \
logger.Trace << output; \
} \
} while (false)
注意 while (false)
后没有分号。
然后你可以像这样使用它
TRACE("Requests pending:" << buffer.findRequests());
do { ... } while (false)
部分很可能会被编译器优化掉,留给您一个简单的 if
检查。如果 logger.Trace.Enabled()
返回 false
,那么除了检查之外什么都不应该发生。
如果您的编译器支持 C++11 或更高版本,它应该支持 variadic macros这应该可以帮助您克服宏参数中逗号的限制。
使用可变参数宏,宏看起来像这样:
#define TRACE(...) \
do \
{ \
if (logger.Trace.Enabled()) \
{ \
logger.Trace << __VA_ARGS__; \
} \
} while (false)
关于c++ - 短路流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342529/
考虑 function foo(x) x isa Bar || throw(ArgumentError("x is not a Int64...")) dosomething(x) e
这个问题在这里已经有了答案: AndAlso/OrElse in VBA (8 个回答) 7年前关闭。 VBA 不会短路 VBA 不支持短路 - 显然是因为它只有按位 And/Or/Not 等操作。来
这个问题在这里已经有了答案: Java operator precedence guidelines (6 个答案) 关闭 7 年前。 你好,我有一个关于 java 中的优先级表的问题。它说 &&
a &= foo(); 只是被 C++ 中的 a = a && foo(); 取代还是还有更多内容? 我关心的是 foo() 的计算。如果 a 为假,它会被调用吗? 最佳答案 && 是否有嵌入式短路:
我正在尝试注释以下代码。 当同时定义了 zone 和 zones 时,或者当定义了 file 时(但不是同时定义了两者),该函数将起作用: def get_file(zone: str, zones:
给定远程beam.smp服务的已知TCP端口和名称,以及已知的cookie,是否可以短路Erlang分发协议(protocol)的Erlang端口映射器守护进程握手阶段并直接建立Erlang shel
我正在尝试注释以下代码。 当同时定义了 zone 和 zones 时,或者当定义了 file 时(但不是同时定义了两者),该函数将起作用: def get_file(zone: str, zones:
我需要从第二个表中查询数据,但前提是满足主表中的一组罕见条件: SELECT ..., IF(a AND b AND c AND (SELECT 1 FROM tableb ...)) FROM ta
如标题所述,我想将 onchange 短路(在选择内部)。我有以下代码,但我只想发送一个硬编码值而不显示选择框。 "> [编辑] 对不起,我不清楚。我什至不想提供
我是 C++ 的新手,很好奇编译器如何处理 bool 值的惰性求值。例如, if(A == 1 || B == 2){...} 如果 A 确实等于 1,那么 B==2 部分是否曾经计算过? 最佳答案
我在尝试让这个 linq 语句起作用时遇到了一些麻烦。我正在使用 linq 查询设置搜索。我想要做的是,如果搜索为空或为空,让它忽略过滤的那一部分。所以我设置了很多 where 子句来缩短 where
这个问题在这里已经有了答案: How to short-circuit a reduce() operation on a Stream? (4 个答案) 关闭 4 年前。 在做项目的时候写了这行,
首先,我不是 Bash 专家。几个月前我发现,如果我同时使用 && 和 || 短路运算符和花括号,那么如果第一个语句以真实值退出,如果 true block 中的最后一条语句退出非零,那么 fail
我有一个使用逻辑 OR 运算符的 NSPredicate,如下所示: NSPredicate(format: "activeFrom == NULL OR %@ >= activeFrom", som
我是 C++ 的新手,很好奇编译器如何处理 bool 值的惰性求值。例如, if(A == 1 || B == 2){...} 如果 A 确实等于 1,那么 B==2 部分是否曾经计算过? 最佳答案
我需要从第二个表中查询数据,但前提是满足主表中的一组罕见条件: SELECT ..., IF(a AND b AND c AND (SELECT 1 FROM tableb ...)) FROM ta
我遇到了这段代码: 我想我们可以归纳为: 然后我找到了这个 article on short circuits和另一个 more focused one一旦我知道他们叫什么。但是,我还是不明白。
据我了解和阅读,您可以在 if 语句(&& 或 ||)中使用短路,以使第二个条件不触发。如果您希望两个条件都触发,您可以使用单个操作数(& 或 |)。 假设我有如下内联 if 语句: var test
在玩弄编译时字符串(char 的可变参数列表)操作时,我需要实现一种方法来检查编译时字符串是否包含另一个(较小的)编译时字符串。 这是我的第一次尝试: template struct Contains
如果我有以下... a OrElse b ... 并且 a 是 真那么显然 b 永远不会被评估。但是如果我添加一个 Or ,然后呢? a OrElse b Or c c 是否/应该得到评估?如果我放入
我是一名优秀的程序员,十分优秀!