如何通过元编程正确创建成员模板函数指针数组

时间:2015-10-27 22:39:37

标签: c++ template-specialization template-meta-programming

我想预先创建一个模板成员函数指针数组,它将使用另一个类在运行时确定的变量进行索引。然后可以将模板功能专门化。

这适用于non-template class,但我在模板类中遇到问题。应用程序有多个主管,为MatchT定义了不同的模板参数,这在代码示例中具有代表性:

#include Data.H  // POD object.
template<typename MatchT>
class Manager
{ 
    public:

    template <int P>
    bool do(Data& d_);

     template<int P, int ...Ps>
     struct table : table<P-1, P-1, Ps... >{};

     template<int... Ps>
     struct table <0, Ps...>
     {
          static constexpr bool(*fns[])(Data&)={do<Ps>...};
     };
  };

   template <typename MatchT>
   template<int... Ps>
   constexpr bool(*Manager<MatchT>::table<0,Ps...>::fns[sizeof...(Ps)])();


//process.h

 #include "Manager.H"

template<typename MatchT>
class Process
{
   public:

   void send(Manager<MatchT>& mgr  );

   private:

    typename Manager<MatchT>::template table<4> _processtable;
};

 //process.c

 template<typename MatchT>
 void Process<MatchT>::send(Manager<MatchT>& mgr)
 {
     ERROR here:
     mgr.*_processtable::fns[1]();
 }

ERROR:
In instantiation of "constexpr bool (* const Manager<MyManager<MyConfig>   >::table<0,0,1,2,3>::fns[4](Data&) 

required from "process.C"...
required from "manager.H" error no  matches converting function 'do' to     type 'bool (* const)(struct Data&)'
   static constexpr bool(*fns[])(Data&) = {do<Ps>...};
note:candidate  is: template<int P> bool Manager<MatchT>::do(Data&) [with int P = P; MatchT = DummyMatch]

  required from "process.C"...
required from "manager.H" error no  matches converting function 'do' to     type 'bool (* const)(struct Data&)'
   static constexpr bool(*fns[])(Data&) = {do<Ps>...};
note:candidate  is: template<int P> bool Manager<MatchT>::do(Data&) [with int P = P; MatchT = MyMatch<MyConfig> >]

我想知道模板类中是否存在静态static constexpr bool(*fns[])(Data&)={do<Ps>...};是否会导致问题。是否无法将每个Manager<MatchT>类型的函数定义为静态?我错过了什么?

1 个答案:

答案 0 :(得分:0)

您声明并将fns定义为函数指针数组,当它确实需要是指向成员函数的指针数组时。尝试:

template<typename MatchT>
class Manager
{ 
    public:

    template <int P>
    bool do(Data& d_);

     template<int P, int ...Ps>
     struct table : table<P-1, P-1, Ps... >{};

     template<int... Ps>
     struct table <0, Ps...>
     {
          static constexpr bool(Manager::*fns[])(Data&)={&Manager::do<Ps>...};
     };
};

template <typename MatchT>
template<int... Ps>
constexpr bool(Manager<MatchT>::*Manager<MatchT>::table<0,Ps...>::fns[sizeof...(Ps)])(Data&);