虽然C ++没有对装饰器的显式语言支持,但事实证明你可以使用C ++ 14泛型lambda非常好地“模拟”它们。 这是我的看法:
#include
template
auto decorator(T&& func)
{
// we create a closure below
auto new_function = [func = std::forward(func)](auto&&... args)
{
std::cout << "BEGIN decorating...\n";
auto result = func(std::forward(args)...);
std::cout << "END decorating\n";
return result;
};
return new_function;
}
int f(int x)
{
std::cout << x * x << '\n';
return x * x;
}
auto decorated = decorator(f);
auto double_decorated = decorator(decorator(f));
int main()
{
decorated(5);
double_decorated(10);
}
当然在装饰器里面你可以添加你想要的任何东西(包括时间等),上面只是一个最小的例子。 如果它看起来太令人生畏,你可以忽略mumbo-jumbo std::forward和C ++ 14广义lambda捕获并简单地拥有
#include
template
auto decorator(T func)
{
// we create a closure below
auto new_function = [func](auto... args)
{
std::cout << "BEGIN decorating...\n";
auto result = func(args...);
std::cout << "END decorating\n";
return result;
};
return new_function;
}
int f(int x)
{
std::cout << x * x << '\n';
return x * x;
}
auto decorated = decorator(f);
auto double_decorated = decorator(decorator(f));
int main()
{
decorated(5);
double_decorated(10);
}