C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 模板化lambda中的所有lambda都是模板化的lambdas吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
虑这段代码(在GCC和MSVC上编译):

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吗?

如果是这种情况,那么看起来模板参数的数量会很快增长,如果我有很多嵌套的lambda(不一定是坏事,但它让我感到意外).

解决方法

我不确定你是否真的可以说lambda是模板化的.具有自动模板参数的lambda类型根本不是模板,因为它与模板模板参数不匹配:

#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,请注明来意。