模板化功能指针说明

时间:2014-02-14 12:49:05

标签: c++ templates function-pointers

我对这里发生的事感到困惑,我希望你们中的一位大师可以帮助我理解。我把这个课程提炼成了似乎相关的方法,希望我没有错过任何东西。

template < int* ( foo::*member_function )( void ) >
class bar
{
public:
    int myFunc( foo* myFoo )
    {
        int* result = ( myFoo->*member_function )();
        return *result;
    }
};

我不明白怎么知道member_function是什么,没有变量,但是它被调用了,有人帮助我吗?

2 个答案:

答案 0 :(得分:6)

实际上可以作为模板参数传递的数据种类有限;也就是说,并非所有模板参数都需要是类型:

  

[C++11: 14.1/1]:非类型模板参数应具有以下之一(可选 cv-qualified )类型:

     
      
  • 整数或枚举类型,
  •   
  • 指向对象或指向函数的指针,
  •   
  • 对对象的左值引用或对函数的左值引用,
  •   
  • 指向成员的指针,
  •   
  • std::nullptr_t
  •   

您已经展示了将指针指向成员作为模板参数传递的示例。

答案 1 :(得分:4)

member_function是在:

中给出的模板参数的名称
template < int* ( foo::*member_function )( void ) >

也就是说,模板参数member_functionfoo的成员函数,它不带任何参数并返回int*

如果使用bar之类的内容创建bar<&foo::a_member_function> b;类型的对象,则member_function模板参数将设置为成员函数foo::a_member_function。然后,当您致电myFunc时,向其传递指向foo的指针,它将在foo上调用该成员函数。