Как правильно создать массив указателей функций шаблона элемента через метапрограммирование

80
7

Я хочу предварительно создать массив указателей на функции элементов-членов, которые будут индексироваться с использованием переменной, определенной во время выполнения другим классом. Затем функции шаблона могут быть специализированными.

Это работает в 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>? Что мне не хватает?

спросил(а) 2015-10-28T01:39:00+03:00 4 года, 5 месяцев назад
1
Решение
80

Вы объявили и определили 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&);

ответил(а) 2015-10-28T02:04:00+03:00 4 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема