如何制作可以包装任何功能的功能包装器?
How to make a function wrapper that can wrap any function?
#include <iostream>
#include <string>
template<typename Func>
class FuncWrapper {
Func func;
std::string name;
public:
FuncWrapper(Func func, std::string name) : func(func), name(std::move(name)) {}
template<typename ...Args>
auto operator()(Args ...args) {
std::cout << "Entering " + name + '\n';
auto ret = func(args...);
std::cout << "Exiting " + name + "\n\n";
return ret;
}
};
template<typename Func>
auto makeFuncWrapper(Func func, std::string name) {
return FuncWrapper<Func>(func, name);
}
int main() {
auto helloWorld = []() { std::cout << "Hello World\n"; };
auto addTwoNums = [](int a, int b) { std::cout << "Adding numbers...\n"; return a + b; };
// makeFuncWrapper(helloWorld, "helloWorld")(); // error: 'void ret' has incomplete type.
std::cout << makeFuncWrapper(addTwoNums, "addTwoNums")(4, 5) << '\n';
}
这个 class FuncWrapper
工作正常并为传递的函数添加了额外的功能,直到传递的函数是 returns void
的函数。我收到 ret
类型不完整的错误消息。有没有其他方法可以使它与 return 类型 void
的函数一起工作?我知道我不能有一个 void
变量,但是在这里, ret
的唯一目的是在函数完成后被 returned 并且它不会被用于错误道。是否有解决方案或一些解决方法来使其工作?有没有更好的方法来实现包装任何函数的函数包装器?
您可能会使用 Raii:
template<typename ...Args>
auto operator()(Args ...args) {
struct EndScope {
std::string& name;
~EndScope() { std::cout << "Exiting " + name + "\n\n"; }
} endScope(name);
std::cout << "Entering " + name + '\n';
return func(args...);
}
您可以进一步处理 std::uncaught_exceptions
的异常
见
#include <iostream>
#include <string>
template<typename Func>
class FuncWrapper {
Func func;
std::string name;
public:
FuncWrapper(Func func, std::string name) : func(func), name(std::move(name)) {}
template<typename ...Args>
auto operator()(Args ...args) {
std::cout << "Entering " + name + '\n';
auto ret = func(args...);
std::cout << "Exiting " + name + "\n\n";
return ret;
}
};
template<typename Func>
auto makeFuncWrapper(Func func, std::string name) {
return FuncWrapper<Func>(func, name);
}
int main() {
auto helloWorld = []() { std::cout << "Hello World\n"; };
auto addTwoNums = [](int a, int b) { std::cout << "Adding numbers...\n"; return a + b; };
// makeFuncWrapper(helloWorld, "helloWorld")(); // error: 'void ret' has incomplete type.
std::cout << makeFuncWrapper(addTwoNums, "addTwoNums")(4, 5) << '\n';
}
这个 class FuncWrapper
工作正常并为传递的函数添加了额外的功能,直到传递的函数是 returns void
的函数。我收到 ret
类型不完整的错误消息。有没有其他方法可以使它与 return 类型 void
的函数一起工作?我知道我不能有一个 void
变量,但是在这里, ret
的唯一目的是在函数完成后被 returned 并且它不会被用于错误道。是否有解决方案或一些解决方法来使其工作?有没有更好的方法来实现包装任何函数的函数包装器?
您可能会使用 Raii:
template<typename ...Args>
auto operator()(Args ...args) {
struct EndScope {
std::string& name;
~EndScope() { std::cout << "Exiting " + name + "\n\n"; }
} endScope(name);
std::cout << "Entering " + name + '\n';
return func(args...);
}
您可以进一步处理 std::uncaught_exceptions
见