C++ 如何从许多函数中获取函数指针并向其传递参数?

C++ 如何从许多函数中获取函数指针并向其传递参数?,c++,function-pointers,C++,Function Pointers,我有许多定义的函数,如下所示,都返回一个int intfn1(intx){ 返回x; } int fn2(标准::字符串x、int y、标准::字符串z){ //处理字符串x和z int x1=过程(x); int z1=过程(z); 返回x1+y+z1; } // ... 还有更多类似的功能 出于某些原因,我需要实现一个包装器来通过函数名调用上述函数 int wrapper(std::string fn_name, some_struct_t data, std::vector<std

我有许多定义的函数,如下所示,都返回一个
int

intfn1(intx){
返回x;
}
int fn2(标准::字符串x、int y、标准::字符串z){
//处理字符串x和z
int x1=过程(x);
int z1=过程(z);
返回x1+y+z1;
}
// ... 还有更多类似的功能
出于某些原因,我需要实现一个包装器来通过函数名调用上述函数

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?
         
    }
}
int包装(std::string fn\u name、一些结构数据、std::vector field\u name){
a_fn_ptr_type fn_ptr=nullptr;/:这是正确的方法吗?
//根据fn_名称,决定调用哪个fn
如果(fn_name==“fn1”){
fn_ptr=&fn1;
}
如果(fn_name==“fn2”){
fn_ptr=&fn2;
}
...
//给定字段_名称,从数据中获取字段,并将其作为参数传递给fn_ptr
用于(自动字段名称:字段名称){
std::any value=get_from_data(data,field_name,field_type);//此调用将更新field_type,以便我们知道值类型。
//:但是如何在此处将每个值作为arg传递给fn_ptr?
}
}
上面的代码演示了我想要实现的目标,我有两个问题(正如
所指出的)


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

受到评论的启发:

采用
某些结构数据、std::vector field\u名称的包装器
。假设

template <typename T>
T get_from_data(some_struct_t, std::string);
模板
从数据(一些结构,std::string)获取数据;
你有一个函数类型

using func_t = std::function<int(const some_struct_t &, const std::vector<std::string>&)>;
使用func\u t=std::function;
您可以通过

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...>{});
}
模板
自动换行执行(int(*func)(参数…,标准::索引顺序)
{
返回[func](常量某些结构和数据,常量标准::向量和字段名称)
{return func(从_数据(数据,字段_name.at(Is))…);};
}
模板
函数换行(int(*func)(参数…)
{
返回wrap_impl(func,std::index_sequence_for{});
}
然后你就可以有一个

std::map<std::string, func_t> functions;
std::map函数;

不能有一个指向函数的指针指向这两个指针中的任何一个。这些功能是不同类型的。你的实际要求是什么?看起来使用函数指针并不是解决方案我使用@idclev463035818认为我们正在寻找一个更像您想要一个中间级别的调度器。这可以保存函数指针的映射来解析字符串键,并决定从何处获取必要数量和参数值。如何调用它们?他们的观点完全不同。至少您需要编写某种适配器,将您的内容转换为这些函数所采用的参数。@avocado是的,@tadman所说的:lambda包装器的负载。这是整个事情的粗略起点,是的。请参见;-)@鳄梨差不多。您应该能够
函数[“fn1”]=wrap(fn1)
,模板参数可以从
fn1
中推导出来。如果函数重载,则必须静态强制转换为该字符串所需的函数指针类型。在
std::any
中包装值的问题是,只能将它们展开为相同的类型。如果存在调用函数的“应该”隐式转换,则会抛出
bad\u any\u cast
。如果constexpr(std::is_convertible_v){return static_cast(data.member)}或者{throw}@avocado,那么可以将每个案例包装在