使用成员函数指针作为模板参数时推断类型

Deducing type, when using member function pointer as template argument

本文关键字:参数 类型 成员 函数 指针      更新时间:2023-10-16

当我想让成员函数作为模板参数时,有没有办法在不提供Caller类型的情况下对其进行寺庙化?

struct Foo
{
    template <typename Caller, void (Caller::*Func)(int)>
    void call(Caller * c) { (c->*Func)(6); }
};
struct Bar
{
    void start() 
    {
        Foo f;
        f.call<Bar, &Bar::printNumber>(this);
               ^^^^  
    }
    void printNumber(int i) { std::cout << i; }
};
int main ()
{
    Bar b;
    b.start();
    return 0;
}

当我尝试时

template <void (Caller::*Func)(int), typename Caller>
void call(Caller * c) { (c->*Func)(6); }

并称它为喜欢

f.call<&Bar::printNumber>(this);

我收到Caller is not class...错误。

那么,有没有办法让编译器推断调用者类型呢?

不,不是你想要的。 Caller可以推断出如果

  1. 指向成员函数的指针是一个参数,而不是模板参数。例如:

    template <class Caller>
    void call(Caller * c, void (Caller::*Func)(int)) { (c->*Func)(6); }
    
  2. 事先就知道了。例如,可以使调用如下所示:

    f.arg(this).call<&Bar::printNumber>();
    

    call函数如下所示:

    template <class Arg>
    struct Binder
    {
      template<void (Arg::*Func)(int)>
      void operator()() const {
        ...
      }
    };
    

    arg函数很容易编写(在您的情况下,它将返回Binder<Bar>,其中Bar是从this推导出来的)。

    不是很方便,恕我直言。