[英]How to have a pointer to a function with arbitrary arguments as a template parameter?
[英]How can you make a function that takes as a parameter an arbitrary function pointer?
我正在尝试执行以下操作,但我不确定是否可行。
我想要一个带有任意函数指针的函数,以将其传递给另一个函数(我知道这是一种代码味道,良好的软件工程实践不是我现在要讨论的内容)。
换句话说,我正在寻找的样子:
void method1(arbitraty pointer p)
{
method2(p);
}
我不确定是否有一种方法来声明任意函数指针(返回值保证为空,但参数在数量和类型上都是任意的)
仅在推断出的类型为函数指针类型时,才使用模板并使用SFINAE启用它:
template <typename T, std::enable_if_t<std::is_function<T>::value, int> = 0>
void method1(T* p)
{
// ...
}
有些人可能认为这是过度设计,但您可以尝试以下方法:
为您感兴趣的每个回调创建一个枚举:
enum GlfwCallback {
KeyCallback,
FramebufferSizeCallback,
// etc.
};
然后创建一个类型族,将每个族与相应的函数指针类型相关联。 通过创建模板结构并反复对其进行专门化来实现:
template<GflwCallback callback>
struct GlfwCallbackType {};
template<>
struct GlfwCallbackType<KeyCallback> {
using CallbackType = GLFWkeyfun;
// or
using CallbackType = void(*)(GLFWwindow *, int, int, int, int);
};
template<>
struct GlfwCallbackType<FramebufferSizeCallback> {
using CallbackType = GLFWframebuffersizefun;
};
// etc.
那你可以写
template<GlfwCallback callback>
void method1(GlfwCallbackType<callback>::CallbackType p) {
// do something with p
method2<callback>(p);
};
另外,请注意,您可以根据应用程序的需要将其他类型,甚至静态函数和数据成员添加到“类型族”中。
可以使用函子(即定义为operator()
定义重载的类)来以理想的,类型安全的方式执行您想要的operator()
。
由于函子是一个类,因此您可以将参数设置为数据成员,并将要作为任意指针传递的函数的实现/调用移到operator()方法中,在这里您可以通过以下方式访问所有参数: this
指针。
此外,您可以定义函子的层次结构,每个函子都有专门的参数和实现,因此您可以像下面这样修改method2的签名:
method2(BaseFunctor* myfunctor) {
if (myfunctor)
(*myfucntor)();
}
并在调用上下文中设置正确的仿函数对象类型。
还要检查lambda(c ++ 11),它们基本上是函子定义的快捷方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.