C ++,将自定义占位符与函数参数

时间:2015-05-31 14:55:32

标签: c++ c++11 variadic-templates template-deduction tuple-packing

我正在尝试编写将执行以下操作的代码片段:让我们假设我们调用了自定义绑定函数

auto bind_obj = bind(some_func, _1, "test")  

之后我们

auto res = bind_obj(42) 

函数some_func:

int some_func(int val, string test)

如何将占位符与实际函数调用中提供的参数匹配,即bind_obj(...)??

换句话说,是否可以将std :: tuple(此处的参数和占位符)和variadic pack(函数参数)迭代到:

  1. 推导出函数some_func;
  2. 的返回类型
  3. 使用正确的std :: tuple在some_func()调用中进一步使用它?
  4. 我试图不使用boost和std :: functional来做到这一点。我认为,我的主要问题是我不了解如何在运行时使用参数构建元组(所有占位符都被正确替换)并推断返回类型。

    我在STL" functional.h"中看到了_Mu模板结构。但它看起来太复杂和超载。

1 个答案:

答案 0 :(得分:2)

由于调用的参数列表和捕获的参数列表的大小不同,因此您不会真正迭代它们。相反,您将获得一个评估函数,该函数根据参数的捕获方式运行:

  • 如果绑定元素是值,则返回值
  • 如果绑定元素是占位符,则返回给定索引处的参数
  • 如果绑定元素是绑定函数,则返回评估此函数的结果

假设绑定对象包含一个名为std::tuple<B...>的{​​{1}}绑定参数,那么你可以构造一个b的调用参数,如下所示:

std::tuple<...>

此代码片段仅显示如何获取匹配的参数类型。真正的工作发生在template <typename... A, std::size_t... I> ... bound::call(std::tuple<A...>&& aux, index_list<I...>) { auto args = std::make_tuple(get_argument<I>(this->b, a)); // ... } template <typename... A> ... bound::operator()(A&&... args) { return this->call(std::tie(std::forward<A>(args)..., make_index_list<sizeof...A>()); } 函数中,如果get_argument<I>(b, a)中索引为a的元素恰好是占位符,则woild只返回占位符值所指示的I元素

代码不包含有关如何创建索引列表的详细信息,如何在整理调用时确定返回类型,或者如何处理rvalue参数......