我想预先创建一个模板成员函数指针数组,它将使用另一个类在运行时确定的变量进行索引。然后可以将模板功能专门化。
这适用于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>
类型的函数定义为静态?我错过了什么?
答案 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&);