gpt4 book ai didi

c++ - 将带捕获的 lambda 传递给模板函数

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

我尝试用一​​个模板函数来包装任何返回 bool 值的 bool 表达式或仿函数。

template<typename BOOL_COND>
bool calculate(const BOOL_COND& bool_cond)
{
return !(!(bool_cond));
}

assert( calculate( true ) );
assert( calculate( 1 == 1 ) );
std::shared_ptr<int> ptr = std::make_shared<int>(11);
assert( calculate( ptr ) );
assert( calculate( []() { return 1 == 1;} ) );
assert( calculate( std::function<bool()>([]() { return std::string().empty();} )) );

std::function<bool(void)> f = [&]() -> bool { return ptr.get();};
assert( calculate( f ));
assert( calculate( std::function<bool(void)>([&]() -> bool { return ptr.get();} )) );

// assert( calculate( [&]() -> bool { return ptr.get();} ) ); // NOT WORK!!!


// clang-600.0.57 with -std=c++1y

如果不显式转换为 std::function,我无法通过捕获传递 lambda。是什么原因?有没有不转换的解决方案?

模板特化??怎么办?

最佳答案

您没有调用由 lambda 表达式 生成的闭包,而只是使用 bool_cond 就好像它是一个 bool 或可以隐式转换一样

您需要改为调用 bool_cond:

template<typename BOOL_COND>
bool calculate(const BOOL_COND& bool_cond)
{
return !(!(bool_cond()));
}

std::function 起作用的原因是它提供了一个 implicit conversion operator bool .


如果你想要一个既适用于函数对象又适用于可隐式转换的bool的“统一”计算函数,你将需要两个重载受 enable_if 约束:

template<typename BOOL_COND>
auto calculate(const BOOL_COND& bool_cond)
-> std::enable_if_t<std::is_invokable_v<const BOOL_COND&>>
{
return !(!(bool_cond()));
}

template<typename BOOL_COND>
auto calculate(const BOOL_COND& bool_cond)
-> std::enable_if_t<!std::is_invokable_v<const BOOL_COND&>>
{
return !(!(bool_cond));
}

使用 C++17:

template<typename BOOL_COND>
bool calculate(const BOOL_COND& bool_cond)
{
if constexpr(std::is_invokable_v<const BOOL_COND&>)
{
return !(!(bool_cond()));
}
else
{
return !(!(bool_cond));
}
}

只是略有相关,但我写了一篇文章,您可能会对将函数/lambda 传递给其他函数的各种方式感兴趣:"passing functions to functions" .

关于c++ - 将带捕获的 lambda 传递给模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604548/

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