如何声明模板化指针的模板化方法?

时间:2017-07-28 08:56:41

标签: c++11 templates using pointer-to-member

typedef可以模仿using。如何直接制作模板化方法指针?

示例:

class MyClass {

  template<bool B> void fnc() { /*...*/ };

  // Now I can do:
  template<bool B>
  using TempPtr = decltype(&MyClass::fnc<B>);
  //              ^^^^^^^^^^^^^^^^^^^^^^^^^^
};

如何在没有decltype的情况下直接编写带下划线的部分?

到目前为止,我已经尝试过:

template<bool B>
using TempPtr = template<bool> void (MyClass::*)();

template<bool B>
using TempPtr = void (MyClass::*<B>)();

...

(后续问题:我可以使用TempPtr作为模板模板参数吗?)

1 个答案:

答案 0 :(得分:1)

这些会起作用,行为略有不同:

template<bool B>
using Ptr = void (MyClass::*)();

using Ptr2 = void (MyClass::*)();

// alternatively
//typedef void (MyClass::*Ptr2)();

使用:

MyClass::Ptr<true> ptr = &MyClass::fnc<true>;

MyClass::Ptr2 ptr2 = &MyClass::fnc<true>;

Ptr中的bool参数与fnc中的参数不同。由于模板类型不是签名的一部分,不匹配将很好地绑定,但可以用于其他目的:

MyClass::Ptr<false> ptr = &MyClass::fnc<true>;

这也是为什么非模板Ptr2也能正常工作的原因。