当我想将成员函数作为模板参数时,是否可以在不提供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...
错误。
那么,有没有办法让编译器推断出调用者类型?
答案 0 :(得分:2)
不,不是你想要的。如果
,可以推断出Caller
指向成员函数的指针是参数,而不是模板参数。例如:
template <class Caller>
void call(Caller * c, void (Caller::*Func)(int)) { (c->*Func)(6); }
事先知道。例如,您可以将呼叫看起来像这样:
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
推断出来的。
不太方便,恕我直言。