微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从许多函数中获取函数指针并将args传递给它?

如何解决如何从许多函数中获取函数指针并将args传递给它?

我有很多定义的函数,如下所示,全部返回一个int

int fn1(int x) {
    return x;
}

int fn2(std::string x,int y,std::string z) {
    // process string x and z
    int x1 = process(x);
    int z1 = process(z);
    return x1 + y + z1;
}

// ... and many more similar functions

由于某些原因,我需要实现一个包装器,以按函数名称调用上述函数

int wrapper(std::string fn_name,some_struct_t data,std::vector<std::string> field_names) {
    a_fn_ptr_type fn_ptr = nullptr; // <q1>: is this a right way to do?

    // by fn_name,decide which fn to call
    if (fn_name == "fn1") {
        fn_ptr = &fn1;
    }
    if (fn_name == "fn2") {
        fn_ptr = &fn2;
    }
    ...

    // given field_names,get the field from data,pass them to fn_ptr as args
    for (auto field_name: field_names) {
        std::any value = get_from_data(data,field_name,field_type); // field_type will be updated by this call,so that we kNow the value type.
        
        // <q2>: but how to pass each value as arg to fn_ptr here?
         
    }
}

上面的代码演示了我要实现的目标,我有两个问题(由<q1><q2>指出)。

我不确定代码是否正确,希望从人们那里得到一些建议,谢谢!

解决方法

受到评论的启发:

采用bool的包装器。假设

some_struct_t data,std::vector<std::string> field_names

您具有函数类型

template <typename T>
T get_from_data(some_struct_t,std::string);

您可以通过以下方式从函数中实例化

using func_t = std::function<int(const some_struct_t &,const std::vector<std::string>&)>;

然后您可以拥有一个

template <typename... Args,size_t... Is>
auto wrap_impl(int(*func)(Args...),std::index_sequence<Is...>)
{
    return [func](const some_struct_t & data,const std::vector<std::string>& field_names)
        { return func(get_from_data<Args>(data,field_names.at(Is))...); };
}

template <typename... Args>
func_t wrap(int(*func)(Args...))
{
    return wrap_impl(func,std::index_sequence_for<Args...>{});
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。