在我的回调系统中,我想存储 std::function
(或其他)有不同的论点。
例子:
void()
void(int, int)
我希望 1) 和 2) 存储在同一个变量中,并选择在实际调用中调用什么
FunctionPointer f0;
FunctionPointer f2;
f0();
f2(4, 5);
有可能做这样的事情吗?或者我必须根据输入参数计数创建几个“FuntionPointer”模板。
编辑
是否有可能以某种方式利用 std::bind 来完成这项任务?使用 std::bind 我可以拥有
std::function<void()> f = std::bind(test, 2, 5);
编辑 2
实际用例:我有一个触发系统,我想将函数指针分配给 Action ,所以当 Action 发生时,函数被调用。
伪代码示例:
structure Trigger
{
Function f;
}
Init:
Trigger0.f = pointer to some function ()
Trigger1.f = pointer to some function (a, b)
Input:
Find Trigger by input
if (in == A) Trigger.f();
else Trigger.f(10, 20)
或者如果可能的话
Input:
Find Trigger by input
if (in == A) f = bind(Trigger.f);
else f = bind(Trigger.f, 10, 20);
f()
最佳答案
如果 std::function
对你来说不是必需的,你可以创建一个代理类。
class fn_t {
public:
typedef void (*fn_1_t)();
typedef void (*fn_2_t)(int, int);
fn_1_t fn_1;
fn_2_t fn_2;
fn_t operator=(fn_1_t func_1) { fn_1 = func_1; return *this; }
fn_t operator=(fn_2_t func_2) { fn_2 = func_2; return *this; }
void operator()() { (*fn_1)(); }
void operator()(int a, int b) { (*fn_2)(a, b); }
};
#include <iostream>
using namespace std;
void first() {
cout << "first" << endl;
}
void second(int a, int b) {
cout << "second " << a << " : " << b << endl;
}
int main() {
fn_t f;
f = &first;
f = &second;
f();
f(5, 4);
return 0;
}
类(class)
fn_t
自动使用你想要的两个原型(prototype),自动分配一个需要的原型(prototype),它可以通过重叠 ()
来调用两个原型(prototype)的函数具有适当参数的运算符。您可能需要检查函数指针的有效性
fn_1
和 fn_2
但我没有包括这个检查最小化。这样做的好处是你只需要 C++,甚至不需要 STL 和 Boost。
关于具有不同参数的 C++ std::function 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32823046/