如何解决如何从许多函数中获取函数指针并将args传递给它?
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 举报,一经查实,本站将立刻删除。