c++ - 带有可变参数模板的成员函数指针

标签 c++ templates delegates function-pointers variadic-templates

我正在尝试用 C++ 编写一个“管理”委托(delegate)的类。我已经为我实现了委托(delegate)类。我希望这个委托(delegate)管理器类有两个功能:

  • 我们将获取一个指向具有给定输入参数/返回类型的特定类型委托(delegate)实例的指针,并将其缓存。

  • 另一个函数将采用正确类型的成员函数,以便将缓存的委托(delegate)实例绑定(bind)到它。

目前,我有:

template<typename... Args>
struct FunctionParamsPack { };

这是该函数采用的参数类型的容器。即对于 foo(int i, double d) 来说,这将是 intdouble。我遵循here的建议.

然后我有 DelegateInfoPack 类:

template<typename FuncRetType,typename... FuncParams>
struct DelegateInfoPack{
    //for look-up by components in the program
    typedef typename DelegateClass<FuncRetType, FuncParams...>          _Delegate;
    //for the delegate manager
    typedef typename FuncRetType                                        _FuncRetType;
    typedef typename FunctionParamsPack<FuncParams...>                  _FuncParams;
};

该结构包含在程序中的组件中,并且它定义了三个类型名称,其中两个将在 DelegateManger 类中使用:

template<typename DelegateInfoPack>
class DelegateManager
{

typedef typename    DelegateInfoPack::_Delegate         _Delegate;  

typedef typename    DelegateInfoPack::_FuncRetType      _FuncRetType;
typedef typename    DelegateInfoPack::_FuncParams       _FuncParams;


void CacheDelegate(_Delegate* del,...) {}

template<typename UserClass>
void BindDelegate(..., _FuncRetType(UserClass::*fp)( _FuncParams())) {} //Doesn't work!

}

我的问题出在 BindDelegate() 函数上。我无法为具有给定返回类型和输入参数类型的类型的成员函数创建正确的签名。

基本上,我需要知道如何使用给定的返回类型和参数类型获得正确的函数指针类型,以便我的 BindDelegate 将其作为参数。

最佳答案

一种方法是使用部分特化:

template<typename> class DelegateManager;

template<typename FuncRetType,typename... FuncParams>
class DelegateManager<DelegateInfoPack<FuncRetType,FuncParams...>>
{
    template<typename UserClass>
    void BindDelegate(_FuncRetType(UserClass::*fp)(FuncParams...))
    {
    }
};

另一种方法是拥有一个生成适当函数类型的类

template <typename FuncRetType,typename FuncParams>
struct FunctionPointer;

template <typename FuncRetType,typename...ARGS>
struct FunctionPointer<FuncRetType,FunctionParamsPack<ARGS...>> {
    typedef FuncRetType (Type)(ARGS...);
};

然后在 BindDelegate 成员函数中使用它:

template<typename UserClass>
void
  BindDelegate(
    typename FunctionPointer<_FuncRetType,_FuncParams>::Type UserClass::*fp
  )
{ ... }

或者甚至可以将其放入您的 DelegateInfoPack 类中:

template<typename FuncRetType,typename... FuncParams>
struct DelegateInfoPack {
    .
    .
    .
    typedef FuncRetType (_FuncType)(FuncParams...);
};

并在您的 DelegateManager 中使用它

template<typename DelegateInfoPack>
struct DelegateManager
{
    .
    .
    .

    typedef typename DelegateInfoPack::_FuncType _FuncType;

    template<typename UserClass>
    void BindDelegate(_FuncType UserClass::*fp)
    {
    }
};

关于c++ - 带有可变参数模板的成员函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40060950/

相关文章:

c++ - 避免模​​棱两可的部分特化

c++ - 构造 chrono::time_point

C++ 模板类型检查

c++ - 从 Delphi 使用 C++ DLL 时出现 AccessViolation

c++ - 如何从迭代器获取迭代器底层类型?

php - 向用户公开 php 模板引擎?

delegates - C# : this. 调用((MethodInvoker)委托(delegate)

javascript - 发送 html 到 window.print 函数而不渲染

ios - 无法在全局方法中分配委托(delegate)

javascript - 如何将两个函数赋予委托(delegate)函数