我知道当函数不是方法时如何使函数成为输入自变量,但是当函数是方法时我不知道该怎么做。
这是我尝试过的:
HttpPostedFileBase
上面的代码无法编译。我已经尝试了很多变体,但是找不到有效的语法用法。 有人可以在语法上解释我在做什么错吗?
答案 0 :(得分:3)
成员语法的指针总是很难弄清楚。您一直在那里,只需将第一个成员函数更改为
void funct_1(int a, void (A::*f)(int))
{
(this->*f)(a);
}
第四个到
void funct_4(int k)
{
if (k % 2)
funct_1(k, &A::funct_2);
else
funct_1(k, &A::funct_3);
}
对于您最初尝试调用成员函数的操作,请注意(A::*f)(a);
在概念上是错误的,因为它没有将成员函数指针f
与 instance 关联A
。成员函数指针是类定义的偏移量,但与该类的特定实例无关。进行实际通话时必须提供此信息。存在特定的运算符可以精确地做到这一点,即.*
中的->*
和this->*f
。由于它们的优先级较低,因此您需要添加一组附加的括号:(this->*f)
。
答案 1 :(得分:3)
我不知道您是否需要使用确切的签名,但是您不能这样做吗?
template<typename Func>
void funct_1(int a, Func&& func)
{
std::forward<Func>(func)(a);
}
您的方法的签名不变:
void funct_4(int k)
{
// some reason to use the function argument functionality...
if (k % 2)
funct_1(k, funct_2);
else
funct_1(k, funct_3);
}
您甚至可以将其扩展为任意数量的参数
template<typename Func>
void funct_1(Func&& func, Args&&... args)
{
std::forward<Func>(func)(std::forward<Args>(args)...);
}