我正在尝试函数式编程,并且我写了这个。

[=](auto p) {
    return [=](auto q) {
        return p(q)(p);
    };
})

我开始想知道这怎么可能,p是什么类型?

所以,我写了这样的东西。
template<class Type>
using LambdaType = std::function<std::function<Type(Type)>(Type)>;


[=](LambdaType<int> p) {
    return [=](LambdaType<int> q) {
        return p(q)(p);
    };
}

编译时,编译器会给我错误。
error C2664: 'std::function<Type (int)> std::_Func_class<_Ret,int>::operator ()(int) const': cannot convert argument 1 from 'std::function<std::function<Type (int)> (int)>' to 'int'
error C2664: 'main::<lambda_cec7eb77d9cd29f3c40710200090f154>::()::<lambda_b8db28542cb51159223ad8d89c63d794>::()::<lambda_224126017af42fcee190e88f299089fc>::()::<lambda_415db9fd88f1008b25af42ccb33b1c77> main::<lambda_cec7eb77d9cd29f3c40710200090f154>::()::<lambda_b8db28542cb51159223ad8d89c63d794>::()::<lambda_224126017af42fcee190e88f299089fc>::operator ()(std::function<std::function<Type (std::function<std::function<int (int)> (int)>)> (std::function<std::function<int (int)> (int)>)>) const': cannot convert argument 1 from 'main::<lambda_cec7eb77d9cd29f3c40710200090f154>::()::<lambda_b8db28542cb51159223ad8d89c63d794>::()::<lambda_fa72c454c823301ba6dfa9cba6f558e0>' to 'std::function<std::function<Type (std::function<std::function<int (int)> (int)>)> (std::function<std::function<int (int)> (int)>)>'

但是那时候我意识到p只接受整数,但是p必须是一个LambdaType<LambdaType<int>>才能接受q
但是,当您将p更改为LambdaType<LambdaType<int>>时,则p仅接受LambdaType<int>,而p不是LambdaType<int>,并且它必须是LambdaType<LambdaType<LambdaType<int>>>才能接受p。

那么,p是什么类型?

哦,对了,这是我关于stackoverflow的第一个问题

最佳答案

好吧,我们正在寻找四种类型PQRS,例如:

  • P(Q) -> R
  • R(P) -> S
  • QS只不过是占位符参数和返回类型,因此我们不需要它们:
    struct Q { };
    struct S { };
    
    PR更加有趣,因为它们需要的签名规范中存在一个循环:R既是P调用的结果,又可以与另一个P一起调用。这使得无法使用仅由其(此处为无限递归)签名定义的函数类型或lambda类型进行声明。

    但是C++可以使用函子轻松地对其进行排序-只需给事物命名,并借助简单的前向声明,就可以很好地创建循环函子:
    struct P;
    
    struct R {
        S operator()(P) const;
    };
    
    struct P {
        R operator()(Q) const { return {}; }
    };
    
    inline S R::operator()(P) const { return {}; }
    

    Live demo on Coliru

    最后,C++具有模板,这使我们能够用有史以来最无聊的解决方案来解决此问题:
    struct O {
        template <class T>
        O const &operator()(T) const { return *this; }
    };
    

    这样的O只会吞下您调用的任何内容,甚至是其自身的实例,甚至都不会在意。

    Live demo on Coliru

    关于c++ - 此lambda的参数是什么类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47842975/

    10-10 05:55