c++ - 如何制作可以包装任何函数的函数包装器?
问题描述
#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';
}
这个类FuncWrapper
工作正常,并为传递的函数添加了一个额外的功能,直到传递的函数是一个返回的函数void
。我收到类型ret
不完整的错误。即使使用返回类型为 的函数,还有其他方法可以使其工作void
吗?我知道我不能有void
变量,但在这里,唯一的目的ret
是在函数完成后返回,并且不会以错误的方式使用它。是否有解决方案或一些解决方法可以使其工作?实现包装任何函数的函数包装器的任何更好方法?
解决方案
您可能会使用 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
请参阅raii-way-to-get-errors-that-are-caught-during-destruction
推荐阅读
- javascript - HTML/JS 用户输入
- javascript - 函数不会更改 IE10-11 中元素的文本
- excel - 在 Excel get&transform 中从 XML 数据源展开可变数量的文本标签
- python - 我没有得到我应该在 for 循环中的内容(错误的数字)
- prometheus - 如何在 grafana 上显示指标时用标签替换目标
- java - Tizen 包管理器无法识别 JDK
- r - 将 2 列与数据名 R 的其余部分进行转置
- typescript - 联合类型:Typescript 抱怨“函数缺少结束返回语句并且返回类型不包括‘未定义’。(2366)”
- python-3.x - 升级到 Python 3.7
- javascript - 点击获取innerhtml到js函数的列表项