C++,将自定义占位符与函数参数匹配
C++, match custom placeholders with function arguments
我正在尝试编写将执行以下操作的代码:假设我们调用了自定义绑定函数
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(此处为参数和占位符)和可变参数包(函数参数)以:
- 推导 return 类型的函数 some_func;
- 正确 std::tuple 以便在 some_func() 调用中进一步使用它 ?
我正在尝试不使用 boost 和 std::functional 来做到这一点。我认为,我的主要问题是我不明白如何在运行时使用参数(所有占位符都被正确替换)构建元组并推断出 return 类型。
我在 STL "functional.h" 中看到了 _Mu 模板结构,但它看起来太复杂和过载了。
由于调用的参数列表和捕获的参数列表的大小不同,您不会真正迭代它们。相反,您会得到一个根据参数的捕获方式进行评估的函数:
- 如果绑定元素是一个值,则它 return 是值
- 如果绑定元素是占位符,它return是给定索引处的参数
- 如果绑定元素是一个绑定函数,它return是这个函数的计算结果
假设您的绑定对象包含一个 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)
函数中,如果 b
中索引 I
处的元素发生,它只会 return 占位符值指示的 a
元素成为占位符。
该代码不包含有关如何创建索引列表、如何在调用结束后确定 return 类型或如何处理右值参数的详细信息...
我正在尝试编写将执行以下操作的代码:假设我们调用了自定义绑定函数
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(此处为参数和占位符)和可变参数包(函数参数)以:
- 推导 return 类型的函数 some_func;
- 正确 std::tuple 以便在 some_func() 调用中进一步使用它 ?
我正在尝试不使用 boost 和 std::functional 来做到这一点。我认为,我的主要问题是我不明白如何在运行时使用参数(所有占位符都被正确替换)构建元组并推断出 return 类型。
我在 STL "functional.h" 中看到了 _Mu 模板结构,但它看起来太复杂和过载了。
由于调用的参数列表和捕获的参数列表的大小不同,您不会真正迭代它们。相反,您会得到一个根据参数的捕获方式进行评估的函数:
- 如果绑定元素是一个值,则它 return 是值
- 如果绑定元素是占位符,它return是给定索引处的参数
- 如果绑定元素是一个绑定函数,它return是这个函数的计算结果
假设您的绑定对象包含一个 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)
函数中,如果 b
中索引 I
处的元素发生,它只会 return 占位符值指示的 a
元素成为占位符。
该代码不包含有关如何创建索引列表、如何在调用结束后确定 return 类型或如何处理右值参数的详细信息...