从迭代器对创建函数参数包

Create function parameter pack from Iterator pair

本文关键字:参数 函数 创建 迭代器      更新时间:2023-10-16

我不知道如何用从迭代器中检索到的可变数量的参数来调用函数。我有一个简单的例子使用std::plus来说明这个问题:

#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/apply.hpp>
#include <iostream>
#include <array>
namespace mpl = boost::mpl;
int main() {
    using OP = std::plus<mpl::_>;
    std::array<int, 2> args = {1, 2};
    // This works (passing each arg separately)
    auto n1 = mpl::apply<OP, int>::type()(args[0], args[1]);
    std::cout << "plus (1,2) = " << n1 << std::endl;
    // what I want is more like:
    // auto n2 = mpl::apply<OP, int>::type()(args);
    // or
    // auto n3 = mpl::apply<OP, int>::type()(args.begin(), args.end());
}

我不知道如何跨越编译时/运行时的界限。谢谢你的指点!

@PiotrS在问题注释部分的注释包含正确答案。我在下面复制了他的答案(并为C++14进行了更新——这大大清理了它)@PiotrS上面的答案是针对C++11的(这正是我所要求的)。

#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/apply.hpp>
#include <iostream> 
#include <array>
#include <utility>
namespace mpl = boost::mpl;
template <typename OP, typename T, typename Args, std::size_t... Is>
auto apply(Args&& args, std::index_sequence<Is...>)
{
    return typename mpl::apply<OP, T>::type()(std::get<Is>(std::forward<Args>(args))...);
}
template <typename OP, typename T, typename Args, std::size_t N = std::tuple_size<std::decay_t<Args>>{}>
auto apply(Args&& args)
{
    return apply<OP, T>(std::forward<Args>(args), std::make_index_sequence<N>{});
}
int main() {
    using OP = std::plus<mpl::_>;
    std::array<int, 2> args = {1, 2};
    auto n1 = mpl::apply<OP, int>::type()(args[0], args[1]);
    std::cout << "plus (1,2) = " << n1 << std::endl;
    auto n2 = apply<OP, int>(args);
    std::cout << "plus ([1,2]) = " << n2 << std::endl;
}

此解决方案利用了论点的完美转发。调用语法正是我想要的。此外,该解决方案适用于任何类似元组的参数类型(专门用于std::get&std::tuple_size)。

感谢@PiotrS!

std::make_index_sequence是一个很好的辅助元函数,用于以下目的:

template <typename Func, typename T, size_t N, size_t... Inds>
int ApplyFuncHelper(std::array<T, N> const& arr, std::index_sequence<Inds...>)
{
 return Func()(arr[Inds]...);
}
template <typename Func, typename T, size_t N>
int ApplyFunc(std::array<T, N> const& arr)
{
 return ApplyFuncHelper<Func>(arr, std::make_index_sequence<N>());
}

实时演示