gpt4 book ai didi

c++ - C++ lambda 的返回类型

转载 作者:可可西里 更新时间:2023-11-01 18:35:52 24 4
gpt4 key购买 nike

我正在编写一个模板函数,它接受一个函数对象(目前是一个 lambda)作为参数,将 lambda 数据类型作为模板参数,并返回与 lambda 返回的相同类型。像这样:

template<typename TFunctor, typename TReturn>
TReturn MyFunc(TFunctor &Func, TReturn) //The second arg is just to keep the template spec happy
{
return Func();
}

消费代码是这样的:

int n = MyFunc([](){return 17;}, int());

我不喜欢指定返回数据类型的丑陋方式。编译器生成的 lambda 类中是否有一些内置的 typedef 会给我它的返回类型?这样 MyFunc 就可以像这样:

template<typename TFunctor>
TFunctor::return_type MyFunc(TFunctor &Func)
{ //...

我希望它返回与 lambda 返回的类型相同的类型,而无需明确说明该类型。

编辑:目前,我所关注的所有 lambda 都是无可争辩的。变量捕获也能起到同样的作用。

最佳答案

由于返回类型可能取决于提供给仿函数的参数,因此您需要在某处指定它们以便查询返回类型。因此,当谈到泛型仿函数时(不将它们限制为(非泛型)lambda),在不知道参数类型的情况下无法确定返回类型。

C++11 有关键字 decltype 可以与 trailing return type 结合使用,以便通过命名表达式来指定函数的返回类型这可能取决于函数参数(在这里,它取决于 Func 是什么):

template<typename TFunctor>
auto MyFunc(TFunctor &Func) -> decltype(Func(/* some arguments */))
{ ... }

因此,如果您不带任何参数地调用它(我在查看您的 lambda 示例时假设了这一点),只需编写:

template<typename TFunctor>
auto MyFunc(TFunctor &Func) -> decltype(Func())
{
return Func();
}

在C++14中,你甚至可以完全省略返回类型而简单地写

template<typename TFunctor>
auto MyFunc(TFunctor &Func)
{
return Func();
}

请注意,即使在 C++03 中,您也不必提供另一个函数参数;另一个模板参数就足够了:

template<typename TReturn, typename TFunctor>
TReturn MyFunc(TFunctor &Func)
{
return Func();
}

int n = MyFunc<int>(someFunctorReturningAnInt);

关于c++ - C++ lambda 的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21462974/

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