gpt4 book ai didi

c++ - 可以使用 std::function typedef 来帮助定义 lambda 吗?

转载 作者:太空狗 更新时间:2023-10-29 20:51:53 25 4
gpt4 key购买 nike

假设我有一个用于特定 std::functiontypedef,例如:

typedef std::function<int(int a, int b, int c)> func_type;

我可以在定义实现它的 lambda 时重用该 typedef 吗?

例如,在下面的示例中,函数 foo 接受一个 func_type,但是 foo 的调用站点需要复制签名:

void foo(func_type f) {
// ...
}

int main() {
foo([](int a, int b, int c){ return a + b + c; });
}

我能否在声明 lambda 时以某种方式重新使用 func_type typedef,这样我就不必重复参数列表(因此更改 func_type typedef对于使用新定义的 lambda 主体将是透明的。

类似于 [](??? func_type ???){ return a + b + c;

最佳答案

std::function<int(int a, int b, int c)>中的变量名不是类型的一部分——它们基本上是评论。无法在任何其他点提取它们。

所以如果你希望得到a , bc你真倒霉。

您可以做的一件简单的事情就是使用 auto :

foo( [](auto...args) { return args+...+0; } );

这接近你想要的。如果你有 3 个参数,你可以这样做:

foo( [](auto a, auto b, auto c) { return a+b+c; } );

但返回类型不匹配,除了因为 std::function为您进行转换。

您可以提取 a 的类型bc并使 lambda 以不同的方式工作,但不使用返回类型。除非你做了一些疯狂的事情,比如:

template<class T>
struct tag_t{ contexpr tag_t(){} using type=T; };
template<class T>
constexprt tag_t<T> tag{};
template<class Tag>
using type_t = typename Tag::type;

template<class F>
struct deducer {
F f;
template<class R, class...Args>
operator std::function<R(Args...)>() const {
return f( tag<R>, tag<Args>... );
}
};

template<class F>
deducer<F> make_deducer( F f ){ return {std::move(f)}; }

int main() {
foo(make_deducer([](auto R, auto...Args){
return []( type_t<decltype(Args)>... args )->type_t<decltype(R)> {
return 0+...args;
});
}));
}

我不建议这样做。但是我从 std::function 中推导出 lambda 的参数类型和返回类型我被传给了。

我们在这里所做的是创建一个推导器类型,当转换为 std::function 时将预期的参数和返回类型传递给它存储的 lambda。然后,该 lambda 会为这些确切的参数生成自定义 lambda。

这既不简短也不简单。

关于c++ - 可以使用 std::function typedef 来帮助定义 lambda 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48142364/

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