C++20模板lambda:如何指定模板参数?

13

假设我有一个 C++20 模板 lambda:

auto foo = []<bool arg>() {
    if constexpr(arg)
        ...
    else
        ...
};

但是我该如何调用它呢?我似乎找不到语法描述。我尝试了通常的foo<true>();template foo<true>();,然而gcc似乎都不喜欢。

1个回答

23
foo.template operator()<true>();

这是正确的语法。您可以在godbolt.org上尝试一下。

这种奇怪的语法之所以存在,是因为:

  • foo 是一个实现了 template<bool> operator() 方法的通用 lambda 函数。
  • foo.operator()<true>() 会将 < 解释为比较运算符。

如果您想要略微更易读的语法,请尝试使用std::bool_constant

auto foo = []<bool arg>(std::bool_constant<arg>) {
    ...
};

foo(std::bool_constant<true>{});

godbolt.org上试试吧。


这表明使用该语言特性的惯用方式与此场景略有不同 :) - lubgr
@lubgr同意,当从函数参数中推断出lambda的显式模板参数时,更符合惯用语。 - Patrick Roberts
@lubgr:该特性的目的是允许从函数参数模式中推导模板参数类型(能够执行[]<class T>(std::vector<T> const &vt)),而不是直接将模板参数传递给函数。 - Nicol Bolas
谢谢@PatrickRoberts!虽然我确实阅读了那个页面,但我并没有完全弄清楚这就是如何称呼它的。 - Tom
有点恶心,不过确实可用。我自己绝对想不出来,所以非常感谢你! - JMRC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接