从迭代器对创建函数参数包
Create function parameter pack from Iterator pair
我不知道如何用从迭代器中检索到的可变数量的参数来调用函数。我有一个简单的例子使用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>());
}
实时演示
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类