仿函数:在类中包装std :: function

时间:2014-05-15 16:11:43

标签: c++ functor

假设我正在编写一个应该提供一些默认计算(函数)的库,但是允许用户在编译时提供自己的库。 例如,假设库提供了一个返回其参数时间3的函数,但用户可以提供自己的函数。

考虑以下计划(被视为MWE):

float myFunction( float v )  // the function the user needs
{
    return v*2;
}

int main()
{
    FuncWrapper f;
    cout << "default: " << f(2) << endl; // should print "6"

    f.AssignFunction( myFunction );
    cout << "now is: " << f(2) << endl; // should print "4"
}

所以我按照建议的std::function构建了一个包裹also here的仿函数FuncWrapper

struct FuncWrapper
{
    std::function<float(float)> foo; // the function used

    float def( float v ) // the default behaviour member function definition
    {
        return v*3;
    }

    float operator()( float v ) // call of function
    {
        return foo(v);
    }

    void AssignFunction( float (*uf)(float) ) { foo = uf; }

// constructor: initializes to default function
    FuncWrapper() : foo(&FuncWrapper::def) {}
};

-std=c++0x的我的机器(gcc 4.6.3)上,我收到了非人类可读的错误消息,如this other answer中所述。为方便起见,代码为runnable here。似乎是gcc 4.8,它不像构造函数(以及其他错误......):

main.cpp: In constructor 'FuncWrapper::FuncWrapper()':
main.cpp:27:64: error: no matching function for call to 'std::function<float(float)>::function(float (FuncWrapper::*)(float))'

为什么这项任务非法?我对此主题有searched,可能是错误的关键字,但没有找到任何相关内容。

有任何线索吗?或者更简单的解决方案,可能没有std::function但是有一个函数指针?

1 个答案:

答案 0 :(得分:3)

在您的示例代码中,您尝试将成员函数分配给带有签名std::function的{​​{1}}。这两个不兼容,因为成员函数具有不同的调用约定:它需要float(float)参数。

设置默认函数this以避免这种情况。