gpt4 book ai didi

c++ - 从迭代器对创建函数参数包

转载 作者:行者123 更新时间:2023-11-30 05:47:33 26 4
gpt4 key购买 nike

我不知道如何使用从迭代器检索到的可变数量的参数来调用函数。我有一个使用 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!

关于c++ - 从迭代器对创建函数参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28523580/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com