0

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

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 (此处的参数和占位符)和可变参数包(函数参数):

  1. 推导出函数 some_func 的返回类型;
  2. 制作正确的 std::tuple 以在 some_func() 调用中进一步使用它?

我正在尝试不使用 boost 和 std::functional 来做到这一点。我认为,我的主要问题是我不明白如何在运行时使用参数构建元组(所有占位符都正确替换)并推断返回类型。

我在 STL "functional.h" 中看到了 _Mu 模板结构,但它看起来过于复杂且过载。

4

1 回答 1

2

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

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

假设您的绑定对象包含一个std::tuple<B...>调用的绑定参数,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由占位符的值指示的元素。Ib

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

于 2015-05-31T15:47:48.583 回答