【发布时间】:2021-08-24 23:19:56
【问题描述】:
我希望以下代码创建 2 个不同的 i 变量或每个实例一个。
class A {
void foo() {
static int i = 0;
i++;
std::cout << i << std::endl;
}
}
auto i1 = A();
auto i2 = A();
i1.foo();
i2.foo();
我希望输出是:
0
0
如何声明一个仅存在于该函数中但在函数调用之间保持不变的变量?
如果您对我需要这种行为的确切原因感到好奇,我认为这个问题有点复杂并且没有必要,但这是我正在处理的问题:
我正在尝试创建一个用于日志记录的宏,它创建一个限制日志记录输出的静态 lambda。它旨在用于类方法中。当前的宏如下所示。
#define ROS_UTILS_THROTTLE_MACRO(LOG_MACRO, message, duration) do { \
static auto COMBINE(throttle_log_,__LINE__) = [&](const std::string&& msg, rclcpp::Duration&& period) { \
static auto next_log_time = ros2_utils::system_time_now() + period; \
auto current_time = ros2_utils::system_time_now(); \
if(current_time >= next_log_time) \
{ \
LOG_MACRO(message); \
next_log_time += period; \
if(next_log_time <= current_time) \
{ \
next_log_time += period; \
} \
} \
}; \
COMBINE(throttle_log_,__LINE__)(message, duration); \
} while (0)
这个宏的用法(大致)如下所示:
class A {
void foo() {
ROS_UTILS_THROTTLE_MACRO(INFO_LOG, "message", 1s);
}
}
A 的 2 个实例应该有 2 个不同的日志函数,它们都分别受到限制。
【问题讨论】:
-
使用类成员变量?
-
不能让它成为
A的成员吗?这将为每个实例提供一个,但显然它将在A的所有函数之间共享。但通常有一个类的成员只在几个函数中使用 -
我无法将其添加为成员变量,因为我正在尝试编写一个用于在函数中创建变量的日志记录宏。我需要该变量在函数调用之间保持不变,以便日志记录按预期工作。宏声明的变量是一个 lambda,它跟踪上次记录的时间并确保上次记录的时间不在限制持续时间内。
-
您不能拥有特定于实例的
static变量。看来您正面临XY Problem。 -
@Slava 在
__func__上键入地图不会产生每个实例的值,但