【问题标题】:Calling a function with a vector of arguments使用参数向量调用函数
【发布时间】:2025-12-11 11:30:02
【问题描述】:

我有一个std::vector 的参数,我想用它们调用一个函数。有没有办法做到这一点?

特别是函数是mysqlx select 函数,参数是我要查询的列;它们都是std::string 类型。该函数的目的是减少代码库中的重复。

(这似乎是一个普遍有用的主题,但我无法通过搜索找到答案。如果我错过了它并且已经回答了,请指出我的问题并将其作为副本关闭,谢谢。)

【问题讨论】:

  • 你知道编译时向量的大小吗?
  • “我有一个 std::vector 参数,我想用它们调用一个函数。有什么办法吗?”是的。通过调用函数,将向量作为参数传递,并通过遍历向量来创建 SQL 语句。
  • 你能添加一些代码来显示你想要实现的目标吗?
  • @Artyer 不,向量会有不同的大小。
  • 不幸的是,将向量转换为元组似乎只能用于固定大小的向量(请参阅here),否则您可以使用std::applyfoo 是“真正的可变参数”(即任意数量的参数)还是最多只有 N 个(例如 0 到 5 个参数)?

标签: c++ c++14 dry variadic


【解决方案1】:

你可以做到这一点,最多编译时参数的最大数量。不好看。

using result_type = // whatever
using arg_type = // whatever
using args_type = const std::vector<arg_type> &;
using function_type = std::function<result_type(args_type)>;

template <size_t... Is>
result_type apply_vector_static(args_type args, std::index_sequence<Is...>)
{
    return select(args[Is]...);
}

template<size_t N>
result_type call_apply_vector(args_type args)
{ 
    return apply_vector_static(args, std::make_index_sequence<N>()); 
}

template <size_t... Is>
std::map<size_t, function_type> make_funcs(std::index_sequence<Is...>)
{
    return { { Is, call_apply_vector<Is> }... };
}

result_type apply_vector(args_type args)
{
    // Some maximum limit
    static const auto limit = std::make_index_sequence<50>();
    static const auto funcs = make_funcs(limit);
    return funcs.at(args.size())(args);
}

See it live

【讨论】:

  • = [](args_type args) 的语法是什么?我的编译器似乎很困惑。 (我有args_type 作为const std::vector&lt;std::string&gt; &amp;。)
  • 糟糕,变量模板是 C++17。它是一个从 lambda 初始化的变量模板。原来一个普通的函数模板就足够了
  • 现在 return { { Is, call_apply_vector&lt;Is&gt;... } }error: parameter packs not expanded with ‘...’ 令人窒息。我对它进行了一些调整,但没有设法让它编译。