3

当我想将成员函数作为模板参数时,有没有办法在不提供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...错误。

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

4

1 回答 1

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)。

    不是很方便,恕我直言。

于 2012-04-19T08:46:56.030 回答