【问题标题】:Variadic templates in class definitions类定义中的可变参数模板
【发布时间】:2013-09-30 07:48:09
【问题描述】:

所以我试图围绕 C++ 中的新可变参数模板进行思考,我想知道是否可以使用它来简化我拥有的一些代码。我有这样的事情:

template<typename FinalPatch,typename ReturnType, typename P1>
class Patch1: public PatchBase
{
   public:
      typedef Patch1<FinalPatch,ReturnType,P1> patch_type;
      typedef ReturnType(WINAPI* FuncType)( P1 );
      typedef std::function<ReturnType(P1)> function_type;


      static ReturnType __stdcall exec( P1 p1 )
      {
         return _function(p1);
      }
};

template<typename FinalPatch,typename ReturnType, typename P1, typename P2>
class Patch2: public PatchBase
{
   public:
      typedef Patch2<FinalPatch,ReturnType,P1,P2> patch_type;
      typedef ReturnType(WINAPI* FuncType)( P1, P2 );
      typedef std::function<ReturnType(P1,P2)> function_type;

      static ReturnType __stdcall exec( P1 p1, P2 p2 )
      {
         return _function(p1, p2);
      }
};

直到大约 10 个 P... 参数。

exec 静态方法用于类似 Detours 的系统中,它替换 WINAPI 函数,然后将其代理到 std::function 委托。

FuncType 表示“普通”函数指针。

是否可以使用可变参数模板将其简化为单个类?如果有,怎么做?

【问题讨论】:

  • typedef Patch1&lt;FinalPatch,ReturnType,P1&gt; patch_type 即使在 C++03 中也不需要这样做,因为 injected-class-name。在类的范围内,名称Patch1 指的是模板的这种特化。例如。 typedef Patch1 patch_type;
  • 感谢您提供的信息。有几次我想知道是不是这样,但从来没有尝试过。

标签: c++ c++11 variadic-templates


【解决方案1】:

类似的东西:

template<typename FinalPatch,typename ReturnType, typename... Ps>
class PatchN: public PatchBase
{
   public:
      typedef PatchN patch_type;
      typedef ReturnType(WINAPI* FuncType)( Ps... );
      typedef std::function<ReturnType(Ps...)> function_type;
      // more "modern" C++11 notation
      //using patch_type = PatchN;
      //using FuncType = ReturnType(WINAPI*)(Ps...);
      //using function_type = std::function<ReturnType(Ps...)>;

      static ReturnType __stdcall exec( Ps... ps )
      {
         return _function(ps...);
      }
      // or, using perfect forwarding:
      //static ReturnType __stdcall exec( Ps&&... ps )
      //{
      //   return _function(std::forward<Ps>(ps)...);
      //}
};

通常,函数类型从单个模板参数中提取(如std::function),例如

template<typename FinalPatch, typename Func>
class PatchN;

template<typename FinalPatch, typename ReturnType, typename... Ps>
class PatchN<FinalPatch, ReturnType(Ps...)>;

【讨论】:

  • 非常好!鉴于 FuncType 函数指针和 exec 方法在幕后的低级性质,我有点担心它们不能按预期工作,但我只是通过我所有的回归测试运行它,它的表现就像一个冠军。这将允许我从我的代码中删除太多的样板废话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2021-10-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多