gpt4 book ai didi

c++ - 是否可以在没有宏的情况下在 C++20 中实现一次日志?

转载 作者:行者123 更新时间:2023-12-05 08:49:01 32 4
gpt4 key购买 nike

我正在寻找的是将记录消息的日志函数,但每个调用站点仅一次。

记录第一次出现的错误、超时等,而不是向 cout/log 文件发送垃圾邮件会很有用。

传统上它是用宏实现的(它们扩展到一些静态 bool /计数器,你可以在 glog 中查看 LOG_FIRST_N 以获得详细信息),但我想知道在 C++20 中它是否可以在没有宏的情况下完成。

我尝试过的: Use std::source_location as template param , 基于此 answer , 不起作用,因为 std::source_location::current() 的魔力没有像我希望的那样起作用。

注意:我知道我可以拥有一个静态的 std::set/std::unordered_set 调用站点,但我对与邪恶的 MACRO 解决方案一样高效的解决方案感兴趣。

最佳答案

由于每个 lambda 表达式的类型不同,您可以使用 lambda 表达式来标记对同一函数的调用。

例如这个:

#include <iostream>


template <typename T,typename F>
void once(T t, F f){
static bool first = true;
if (first) {
f();
first = false;
}
}

int main(){
for (int i=0; i <1000; ++i){
once([](){},[](){ std::cout << "A";});
}
for (int i=0; i <1000; ++i){
once([](){},[](){ std::cout << "B";});
}

}

打印

 AB

但是,once([](){},... 有点笨拙,使用宏仍然很诱人。


PS:如评论中所述,自 C++20 以来,lambda 可以用作模板的默认参数,甚至可以在您之前执行以下操作:

#include <iostream>

template <typename F,typename T>
void once_impl(F f, T t){
static bool first = true;
if (first) {
f();
first = false;
}
}

template <typename F>
void once(F f) { once_impl(f,[](){});}

int main(){
for (int i=0; i <1000; ++i){
once([](){ std::cout << "A";});
}
for (int i=0; i <1000; ++i){
once([](){ std::cout << "B";});
}
}

关于c++ - 是否可以在没有宏的情况下在 C++20 中实现一次日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65303992/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com