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

时间:2012-04-19 08:33:30

标签: c++ templates

当我想将成员函数作为模板参数时,是否可以在不提供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...错误。

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

1 个答案:

答案 0 :(得分:2)

不,不是你想要的。如果

,可以推断出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推断出来的。

    不太方便,恕我直言。