gpt4 book ai didi

c++ - 类 Python C++ 装饰器

转载 作者:IT老高 更新时间:2023-10-28 12:50:59 25 4
gpt4 key购买 nike

有没有办法像python风格一样在C++中装饰函数或方法?

@decorator
def decorated(self, *args, **kwargs):
pass

以宏为例:

DECORATE(decorator_method)
int decorated(int a, float b = 0)
{
return 0;
}

DECORATOR_MACRO
void decorated(mytype& a, mytype2* b)
{
}

有可能吗?

最佳答案

std::function为我提出的解决方案提供了大部分构建 block 。

这是我提出的解决方案。

#include <iostream>
#include <functional>

//-------------------------------
// BEGIN decorator implementation
//-------------------------------

template <class> struct Decorator;

template <class R, class... Args>
struct Decorator<R(Args ...)>
{
Decorator(std::function<R(Args ...)> f) : f_(f) {}

R operator()(Args ... args)
{
std::cout << "Calling the decorated function.\n";
return f_(args...);
}
std::function<R(Args ...)> f_;
};

template<class R, class... Args>
Decorator<R(Args...)> makeDecorator(R (*f)(Args ...))
{
return Decorator<R(Args...)>(std::function<R(Args...)>(f));
}

//-------------------------------
// END decorator implementation
//-------------------------------

//-------------------------------
// Sample functions to decorate.
//-------------------------------

// Proposed solution doesn't work with default values.
// int decorated1(int a, float b = 0)
int decorated1(int a, float b)
{
std::cout << "a = " << a << ", b = " << b << std::endl;
return 0;
}

void decorated2(int a)
{
std::cout << "a = " << a << std::endl;
}

int main()
{
auto method1 = makeDecorator(decorated1);
method1(10, 30.3);
auto method2 = makeDecorator(decorated2);
method2(10);
}

输出:

Calling the decorated function.
a = 10, b = 30.3
Calling the decorated function.
a = 10

附言

Decorator 提供了一个地方,您可以在其中添加函数调用之外的功能。如果你想简单地传递到 std::function,你可以使用:

template<class R, class... Args >
std::function<R(Args...)> makeDecorator(R (*f)(Args ...))
{
return std::function<R(Args...)>(f);
}

关于c++ - 类 Python C++ 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30679445/

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