gpt4 book ai didi

c++ - 有没有办法修改模板装饰器中使用的静态方法中的类属性?

转载 作者:行者123 更新时间:2023-12-03 07:53:14 26 4
gpt4 key购买 nike

我正在研究 Cpp 模板并尝试如何实现类似装饰器的功能,以便当我调用 log.warn 时,会在 warn 方法之上执行一些额外的代码,从而导致向该方法添加额外的行为,但实际上并未覆盖它。

#include <cstdio>

template <typename Func>
struct Decorator {
Func* func;
template <typename... Args>
auto operator()(Args... args) {
printf("Before function execution\n");
(*func)(args...);
printf("After function execution\n");
}
};

class Logger{
private:
int val= 0;
static void warn(char * str, char * ptr){
printf("Inside warn()\n");
printf("%s %s\n", str, ptr);
}
void info(){printf("Inside info()\n");}
public:
Decorator<decltype(warn)> decoratedWarn{warn};
int get_val(){return val;}
};

int main(){
char str[6] = "hello";
char ptr[6] = "world";
Logger log;
log.decoratedWarn(str, ptr);
printf("%d\n", log.get_val());
return 0;
}

这种方法背后的目标是在实际调用 warn 之前打印时间。我似乎无法弄清楚的另一个目标是如何修改类属性的值,例如静态函数中的 val ,以便每次都会递增 val调用了 warn

最佳答案

问题是,为了增加 Decorator 中的 val,您需要 Decorator 中有一个可用的实例。这使您能够调用您可能提供的增量函数。

但是,有多种方法可以实现这一目标。您发布的答案中的内容很乏味,因为它每次都需要将 log 实例传递给 Decorator::operator()

log.decoratedWarn(str, ptr, &log);

我可以通过让 Logger 来管理自己的成员来避免这种情况。 Follwoing 是一个 C++20 代码示例:

#include <cstdio>
#include <utility>

template <auto Func, typename Instance>
class Decorator
{
Instance* mInstance{ nullptr };
public:
explicit Decorator(Instance* object)
: mInstance{ object }
{}

template <typename... Args>
auto operator()(Args&&... args)
{
printf("Before function execution\n");
Func(mInstance, std::forward<Args>(args)...);
printf("After function execution\n");
}
};

class Logger
{
private:
int val = 0;

static void warn(Logger* self, char* str, char* ptr) {
printf("Inside warn()\n");
printf("%s %s\n", str, ptr);
self->val++; // Increment the class attribute
}

void info() {
printf("Inside info()\n");
}

public:
Decorator<&Logger::warn, Logger> decoratedWarn{ this };

int get_val()
{
return val;
}
};

int main()
{
char str[6] = "hello";
char ptr[6] = "world";
Logger log;
log.decoratedWarn(str, ptr);
printf("%d\n", log.get_val()); // 1

log.decoratedWarn(str, ptr);
printf("%d\n", log.get_val()); // 2
return 0;
}

关于c++ - 有没有办法修改模板装饰器中使用的静态方法中的类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76631960/

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