繁体   English   中英

如何制作一个将任意函数指针作为参数的函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM