我正在尝试函数式编程,并且我写了这个。
[=](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的第一个问题
最佳答案
好吧,我们正在寻找四种类型P
,Q
,R
和S
,例如:
P(Q) -> R
R(P) -> S
Q
和S
只不过是占位符参数和返回类型,因此我们不需要它们:struct Q { };
struct S { };
P
和R
更加有趣,因为它们需要的签名规范中存在一个循环: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/