假设您定义了一个回调函数:
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)>'
这可能吗?提前谢谢。
答案 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