众所周知,模板参数可以是指向成员函数的指针。
所以我可以写:
struct Bar
{
int fun(float x);
};
template <int (Bar::*FUN)(float)>
struct Foo
{ /*...*/ };
typedef Foo<&Bar::fun> FooBar;
但是,如果我希望 Bar
类型本身成为模板参数怎么办:
template <typename B, int (B::*FUN)(float)>
struct Foo
{ /*...*/ };
typedef Foo<Bar, &Bar::fun> FooBar;
现在,当我使用它时,我必须写两次Bar
!
我的问题是:有没有办法强制编译器自动推断类类型?
目标是让它正常工作:
typedef Foo<&Bar::fun> FooBar;
typedef Foo<&Moo::fun> FooMoo;
最佳答案
简单的回答:不,没有。
问题在于 typedef Foo<&Bar::fun> FooBar;
为了工作,模板必须有一个非类型参数,但是在声明模板时该参数的类型是未知的,这是无效的。另一方面,类型推导永远不会应用于模板的参数(仅适用于函数模板的参数,但那些是函数的参数,而不是模板)。
关于c++ - 成员函数指针的模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11745764/