我正在尝试编写将执行以下操作的代码片段:让我们假设我们调用了自定义绑定函数
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(函数参数)迭代到:
我试图不使用boost和std :: functional来做到这一点。我认为,我的主要问题是我不了解如何在运行时使用参数构建元组(所有占位符都被正确替换)并推断返回类型。
我在STL" functional.h"中看到了_Mu模板结构。但它看起来太复杂和超载。
答案 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参数......