类方法的函数对象

时间:2019-05-20 09:21:58

标签: c++ class function-object

我知道当函数不是方法时如何使函数成为输入自变量,但是当函数方法时我不知道该怎么做。

这是我尝试过的:

HttpPostedFileBase

上面的代码无法编译。我已经尝试了很多变体,但是找不到有效的语法用法。 有人可以在语法上解释我在做什么错吗?

2 个答案:

答案 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)...);
}