【问题标题】:C++ Lambda with template带有模板的 C++ Lambda
【发布时间】:2021-04-15 13:39:49
【问题描述】:

我想调用一个带有 const 模板值的 lambda,在下面的例子中我应该正确写 lambdaTemplate

#include <iostream>

using namespace std;

template<int bar, int baz>
int foo(const int depth) {
    return bar + baz + depth;
}

int main() {
    ////// call function
    cout << foo<1, 2>(10) << endl; // 13

    ///// call lambda without template value
    const auto lambda1 = [&](const int v) {
        return foo<1, 2>(v);
    };
    cout << lambda1(10) << endl; // 13

    ///// call lambda with template value
    const auto lambdaTemplate = [&]<A,B ??? >(const int v) { // <-- ERROR doesn't compile
        return foo<A,B>(v);
    };

    cout << lambdaTemplate<1,2>(10) << endl;

    return 0;
}

【问题讨论】:

  • 您是否使用了支持 lambda 模板参数的编译器?这是一个相当新的功能(C++20)。在这种情况下,模板参数应该类似于foo
  • 是的,我使用 C++20
  • 即使使用 C++20,模板参数也必须是可推导出的(或者没有好的语法)。无论哪种方式,如果您想要的是捕获lambdaTemplate&lt;1,2&gt;(10),那是行不通的。
  • 不过,您可以让lambdaTemplate(constant&lt;1&gt;, constant&lt;2&gt;)(10) 工作。

标签: c++ templates lambda c++20


【解决方案1】:

你可以这样定义 lambda:

auto lambdaTemplate = [&]<int T1, int T2>(const int v) {
    return foo<T1, T2>(v);
};

然后这样称呼它

std::cout << lambdaTemplate.operator()<1,2>(10);

【讨论】:

  • 注意lambdaTemplate不是依赖名,因此在访问转换函数模板时不要使用template关键字。充其量这是多余的,但最坏的情况是格式不正确(但仍然被一些编译器接受),如the following Q&A 所述。
  • @dfrib:解析器指南现在允许在非依赖上下文中使用(我担心这只会助长人们对其目的的混淆),只要它实际上是一个 template-id 接下来。
  • @DavisHerring 我明白了,谢谢。我看到我什至在我对linked Q&A 的自我回答中指出了这一点,但后来忘记了;允许这样做确实有点令人困惑(而且有点违反直觉)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2015-05-12
  • 2018-12-17
  • 2019-11-13
  • 2014-11-06
  • 1970-01-01
相关资源
最近更新 更多