gpt4 book ai didi

c++ - 为 lambda 重载 &&

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:49 25 4
gpt4 key购买 nike

我想为 lambda 重载运算符 &&,它以任意(单个)值作为输入并产生 bool,即类似以下内容:

auto operator&&( func_t lhs, func_t rhs )
{
return []( auto x ){ return lhs(x) && rhs(x) };
}

但是,我不知道如何定义 func_t 以便它对应于所需 lambda 的类型(即接受任意单个输入并产生 的 lambda bool )

有人知道如何实现吗?

最佳答案

我不确定这是个好主意,因为 molbdnilo提到,你不会短路,我认为代码会误导读者。

无论如何,std::function 是一个代价高昂的抽象,应该避免出现在此处,因为您不需要它的特性。

使用模板函数std::enable_if将工作:

template <typename T>
using returns_bool_when_called_with_int =
std::is_same<decltype(std::declval<T&>()(std::declval<int>())), bool>;

template <typename T0, typename T1>
using lambda_and_enabler = std::enable_if_t
<
returns_bool_when_called_with_int<T0>{} &&
returns_bool_when_called_with_int<T1>{}
>;

template <typename T0, typename T1, typename = lambda_and_enabler<T0, T1>>
auto operator&&( T0 lhs, T1 rhs )
{
// Note that `lhs` and `rhs` are being captured by copy.
// See the note at the end of the post for a more general alternative.
return [=]( auto x ){ return lhs(x) && rhs(x); };
}

上面的代码可以如下使用:

int main()
{
auto l0 = [](int x){ return x % 3 == 0; };
auto l1 = [](int x){ return x % 2 == 0; };
auto l_and = l0 && l1;

assert(l_and(6));

assert(!l_and(5));
assert(!l_and(4));
}

wandbox example


注意:您可能需要 perfect forward您的 lhsrhs lambdas 到 operator&& 返回的 lambda 中,以避免不必要的复制并支持引用语义 .我最近写了一篇关于此的文章:"capturing perfectly-forwarded objects in lambdas" .

您的通用 operator&& 函数将如下所示:

template <typename T0, typename T1,
typename = lambda_and_enabler<std::decay_t<T0>, std::decay_t<T1>>>
auto operator&&(T0&& lhs, T1&& rhs)
{
return [lhs = FWD_CAPTURE(lhs), rhs = FWD_CAPTURE(rhs)](auto&& x) mutable
{
return access(lhs)(x) && access(rhs)(x);
};
}

关于c++ - 为 lambda 重载 &&,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41141780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com