首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++中使用Null Lambda?

如何在C++中使用Null Lambda?
EN

Stack Overflow用户
提问于 2017-08-17 14:23:44
回答 3查看 4.8K关注 0票数 18

我想像这样声明一个函数:

代码语言:javascript
复制
template <typename Lambda>
int foo(Lambda bar) {
    if(/* check bar is null lambda */)
        return -1;
    else
        return bar(3);
}

int main() {
    std::cout << foo([](int a)->int{return a + 3;}) << std::endl;
    std::cout << foo(NULL_LAMBDA) << std::endl;
}

那么,我如何声明NULL_LAMBDA和检查传递的lambda函数的条件是否为空?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-17 14:30:50

您可以添加专用专业化认证:

代码语言:javascript
复制
#include <iostream>
#include <cstddef>

template<typename Lambda> int
foo(Lambda bar)
{
    return(bar(3));
}

template<> int
foo<::std::nullptr_t>(::std::nullptr_t)
{
    return(-1);
}

int main()
{
    ::std::cout << foo([] (int a) -> int {return(a + 3);}) << ::std::endl;
    ::std::cout << foo(nullptr) << ::std::endl;
}
票数 26
EN

Stack Overflow用户

发布于 2017-08-18 13:34:08

Lambda是一种类型,而不是一种类型。

我们可以这样做:

代码语言:javascript
复制
struct null_callable_t{
  template<class...Ts>
  constexpr void operator()(Ts&&...)const{}
  explicit constexpr operator bool()const{return false;}
  constexpr null_callable_t() {}
  friend constexpr bool operator==(::std::nullptr_t, null_callable_t ){ return true; }
  friend constexpr bool operator==(null_callable_t, ::std::nullptr_t ){ return true; }
  friend constexpr bool operator!=(::std::nullptr_t, null_callable_t ){ return false; }
  friend constexpr bool operator!=(null_callable_t, ::std::nullptr_t ){ return false; }
};

constexpr null_callable_t null_callable{};

现在我们的代码变成:

代码语言:javascript
复制
template <typename Lambda>
int foo(Lambda bar) {
  if(!bar)
    return -1;
  else
    return bar(3);
}

这很巧妙:

代码语言:javascript
复制
std::cout << foo([](int a) {return a + 3;}) << std::endl;
std::cout << foo(null_callable) << std::endl;
票数 2
EN

Stack Overflow用户

发布于 2021-02-08 12:39:33

注意,在C++17中,我们可以这样写:

代码语言:javascript
复制
template<typename Lambda>
int foo(Lambda bar)
{
    if constexpr (std::is_same_v<std::decay_t<Lambda>, std::nullptr_t>)
        return -1;
    else if constexpr (std::is_convertable_v<Lambda, bool>)
    {
        if (bar)
            return bar(3);
        else
            return -1;
    }
    else
        return bar(3);
}

我想在C++20中我们可以定义一个std::invocable (概念头)或nulltpr_t来约束Lambda的概念。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45727933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档