大佬教程收集整理的这篇文章主要介绍了c – 模板化lambda中的所有lambda都是模板化的lambdas吗?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
int main() { auto foo = [](auto p){ typedef decltype(p) p_t; auto bar = [](){ return static_cast<p_t>(10); }; return bar(); }; std::cout << foo(0ull) << std::endl; }
foo()是一个模板化的lambda,因为它有一个auto参数.但是对于bar()知道类型p_t,它必须以某种方式隐式模板化,然后引导我到标题中的问题:
在模板化的lambdas中的所有lambda都是模板化的lambdas吗?
#include <iostream> auto foo = [](auto param){}; template <class T> struct functor_template { void operator()() const { } }; template <template <class...> class Foo,class... Ts> void bar(Foo<Ts...>) { } int main() { //bar(foo); //prog.cc:7:6: note: template argument deduction/substitution Failed bar(functor_template<int>{}); }
原因很简单 – 只有在这样的lambdas中非常接近被称为模板的东西是它们的operator().
但我想你想问更多lambda中带有auto参数的lambda类型是否依赖于传递给lambda的参数类型.答案是 – 是的.这很容易测试:
#include <iostream> #include <type_Traits> auto foo = [](auto p){ static_cast<void>(p); typedef decltype(p) p_t; auto bar = [](){ return static_cast<p_t>(10); }; return bar; }; int main() { static_cast<void>(foo); std::cout << std::is_same<decltype(foo(int{})),decltype(foo(float{}))>::value << std::endl; std::cout << std::is_same<decltype(foo(int{})),decltype(foo(int{}))>::value << std::endl; }
输出:
0 1
以上是大佬教程为你收集整理的c – 模板化lambda中的所有lambda都是模板化的lambdas吗?全部内容,希望文章能够帮你解决c – 模板化lambda中的所有lambda都是模板化的lambdas吗?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。