Чтобы использовать BOOST_PP_ENUM
в указанном вами способе, вам понадобится макрос, который принимает «число» и дает выражение, являющееся адресом соответствующего члена соответствующего класса. Я не вижу хорошего способа сделать это без явного списка, если все нужные функции не имеют именованных имен (например, memfun1
, memfun2
и т. Д.). За исключением случая, будет проще явно перечислить выражения адреса функции, которые использовались для BOOST_PP_ENUM.
Вы используете идентификаторы в этом массиве, которые совпадают с параметрами шаблона в Some_class
.
R (U::* const pmfi[])(T&) = { /* ... */ }
Это действительно должен быть шаблонный член Some_class?
template< class T, class U, class R >
R (U::* const Some_class<T, U, R>::pmfi[])(T&) = { /* ... */ }
Если это так, будет ли работать один и тот же экземпляр со всеми комбинациями типов, с которыми вы собираетесь использовать шаблон Some_class
? Если это так, у вас есть очень ограниченный набор классов, возможно, вы можете покончить с шаблоном. Если нет, то вам придется специализироваться Some_class
для каждой комбинации параметров шаблона, и в этом случае шаблон не очень вам помогает.
Редактировать, опубликовать редактирование: Если я вас правильно понял, вы не сможете сделать то, что предложили, потому что массив указателей должен иметь точно правильную подпись.
Сокращая это до простого примера указателя на функцию, вы не можете сделать это:
void f(Derived&);
void (*p)(Base&) = &f;
в противном случае это подорвет безопасность типов:
OtherDerived od; // derived from Base, but no from Derived
// I've managed to pass something that isn't a Derived reference to f
// without an explicit (and dangerous) cast
(*p)(od);
В вашем массиве указателей функций все инициализаторы должны быть функциями правильной сигнатуры.