要以您所展示的方式使用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);
在你的函数指针数组中,初始化器必须都是正确签名的函数。