gpt4 book ai didi

具有不同参数的 C++ std::function 变量

转载 作者:行者123 更新时间:2023-12-03 18:59:56 25 4
gpt4 key购买 nike

在我的回调系统中,我想存储 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_1fn_2但我没有包括这个检查最小化。

    这样做的好处是你只需要 C++,甚至不需要 STL 和 Boost。

    关于具有不同参数的 C++ std::function 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32823046/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com