没有参数的C ++存储函数

时间:2014-10-09 02:46:03

标签: c++ callback function-pointers

假设您定义了一个回调函数:

typedef std::function<void(float)> Callback;

你有这样的功能:

void ImAFunction(float a)
{
    //Do something with a
}

有没有办法能够在没有参数的情况下存储函数,然后在以后将其传递给它?

如:

//Define the Callback storage
Callback storage;

storage = std::bind(ImAFunction, this);

//Do some things

storage(5);

这不会起作用,我用下面的一些实际代码解释。

如果我用std :: bind函数绑定值,我可以接近我想要的东西。如:

//Change
//storage = std::bind(ImAFunction, this);
storage = std::bind(ImAFunction, this, 5.0); //5.0 is a float passed

这样可行但是当我通过函数传递一个值时,结果就是我之前设置的值:

storage(100); //Output is still 5

我的理由是,我认为这篇文章是可行的。

http://www.cprogramming.com/tutorial/function-pointers.html

它不使用函数或绑定函数,但它确实传递指针参数并执行我所需要的。我之所以不跳过bind函数的原因是因为我试图将函数存储在类(私有)中,如果它是模板,我就无法存储它,因为它是用类创建的。

上面产生的错误来自以下代码:

struct BindInfo {
    Callback keyCallback;
    int bindType;
    bool isDown;
    bool held;
    std::string name;
};

template <class T1>
void bindEvent(int bindType, T1* keydownObj, void(T1::*keydownF)(float), std::string name)
{
    BindInfo newKeyInfo = { std::bind(keydownF, keydownObj), bindType, false, false, name };

    inputBindings.insert(std::pair<int, BindInfo>(BIND_NULL, newKeyInfo));
};

错误是:

No viable conversion from '__bind<void(Main::*&)(float), Main *&>' to 'Callback' (aka 'function<void (float)>'

这可能吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以为未绑定的参数添加占位符:

std::bind(&Main::ImAFunction, this, std::placeholders::_1);

如果你发现有点拗口,一个lambda可能更具可读性:

[this](float a){ImAFunction(a);}

答案 1 :(得分:0)

听起来你正在寻找的是一个函数指针。虽然我没有很多在C ++中使用它们的经验,但我在C中使用过它们:是的,它是可能的。也许是这样的:

void (*IAmAFunctionPointer)(float) = &IAmAFunction;

考虑该行的最佳方法是,IAmAFunctionPointer是一个指针(因此是*),它返回一个void,并采用float。然后:

float a = 5;
IAmAFunctionPointer(a);

您甚至可以设计它,以便将回调函数传递给方法(我假设这是您正在寻找的)。

    void DoStuffThenCallback(float a, void (*callback)(float))
    {
     //DoStuff
     callback(a);
    }

进一步阅读:http://www.cprogramming.com/tutorial/function-pointers.html