gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:26:14 29 4
gpt4 key购买 nike

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

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 模板结构,但它看起来太复杂和过载了。

最佳答案

由于调用的参数列表和捕获的参数列表的大小不同,您不会真正迭代它们。取而代之的是,您会得到一个根据参数的捕获方式进行评估的函数:

  • 如果绑定(bind)元素是一个值,它返回值
  • 如果绑定(bind)元素是一个占位符,它返回给定索引处的参数
  • 如果绑定(bind)元素是一个绑定(bind)函数,它返回这个函数的计算结果

假设您的绑定(bind)对象包含一个 std::tuple<B...>称为 b 的绑定(bind)参数那么你可以构建一个 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 元素的函数如果索引 I 处的元素由占位符的值指示在b恰好是一个占位符。

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

关于C++,将自定义占位符与函数参数匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30558835/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com