是否有可能制作一个具有NULL检查的通用c++函数指针包装器?
Is it possible to make a generic C++ function pointer wrapper with NULL checks?
我必须包装几个函数指针,可以有NULL值。我试图为此制作一个通用的类模板,它检查函数指针是否为NULL,如果指针不为NULL则调用原始函数,如果指针为NULL则返回默认值。像这样:
//Function typedefs
typedef void(*foo)();
typedef int(*bar)(int u, char *);
//Function pointers
foo gfFoo;
bar gfBar;
//Wrapper class
template<typename T, typename... Args>
class WrapFuncObj {
T* f;
public:
WrapFuncObj(T* t) {
f = t;
}
typename std::result_of<T(Args...)>::type operator()(Args&&... args) {
if(f != nullptr){
return (*f)(std::forward<Args>(args)...);
}
else
{
return 0; //RETURN something for non-void types
}
}
};
template<typename T, typename... Args>
class WrapFuncObjVoid {
T* f;
public:
WrapFuncObjVoid(T* t) {
f = t;
}
typename std::result_of<T(Args...)>::type operator()(Args&&... args) {
if(f != nullptr){
(*f)(std::forward<Args>(args)...);
}
else
{
//DO Nothing for void
}
}
};
//Usage:
WrapFuncObjVoid<foo> WrapFoo(&gfFoo);
WrapFoo();
WrapFuncObj<bar, int, char*> WrapBar(&gfBar);
WrapBar(0, "test");
可以看到,非void和void类型需要单独的模板,因为在null的情况下,如果函数指针为null,则不应该返回任何内容。如何规避这个问题,使一个模板足够的两个?
您可以只使用return T();
(假设T
是您想要的返回类型)。这适用于void
类型。它不适用于具有非默认构造函数的类型。
#include <iostream>
#include <utility>
void foo() {
std::cout << "void foo()n";
}
int bar(int u, char* c_str) {
std::cout << "int bar(" << u << ", "" << c_str << "")n";
return u;
}
template<typename T>
class WrapFuncObj;
template<typename T, typename... Args>
class WrapFuncObj<T(Args...)> {
T (*f)(Args...);
public:
WrapFuncObj(T (*t)(Args...)) {
f = t;
}
T operator()(Args&&... args) {
if(f != nullptr) {
return (*f)(std::forward<Args>(args)...);
} else {
return T();
}
}
};
int main() {
WrapFuncObj<void()> wrap_foo(&foo);
wrap_foo();
WrapFuncObj<int(int, char*)> wrap_bar(&bar);
wrap_bar(0, "test");
WrapFuncObj<void()> wrap_null(nullptr);
wrap_null(); // prints nothing.
}
现场演示。
我觉得有义务建议使用std::function
,这是您试图重新发明的(除非您允许调用null函数并返回默认类型,这可能是也可能不是您真正想要做的事情)。
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 清除前检查矢量
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- C++LDAP检查用户是否是特定组的成员
- 检查TCHAR数组输入是否为带符号整数C++
- 用概念检查属性的类型