gpt4 book ai didi

C++模板非类型参数lambda函数

转载 作者:太空狗 更新时间:2023-10-29 20:43:09 25 4
gpt4 key购买 nike

这个有效:

#include <functional>

template < bool (*F)( int ) > class Foo {};

bool fooFunc( int n ) { return true; }

int main( int argc, char* argv[] )
{
auto a = Foo< fooFunc >();
}

但这不起作用,因为您无法将 lambda 转换为函数指针:

#include <functional>

template < bool (*F)( int ) > class Foo {};

auto barFunc = [] ( int n ) -> bool { return true; };

int main( int argc, char* argv[] )
{
auto a = Foo< barFunc >();
}

这行不通,因为您不能将 std::function<> 用作模板非类型参数:

#include <functional>

template < std::function< bool( int ) > F > class Bar {};

auto barFunc = [] ( int n ) -> bool { return true; };

int main( int argc, char* argv[] )
{
auto b = Bar< barFunc >();
}

那么我该如何创建一个能够接受 lambda 封装作为模板非类型参数的模板类呢?

最佳答案

只需创建一个带有类型参数的类模板,并在实例化模板时使用 decltype 推断 lambda 的类型。

#include <functional>

template <typename Function>
class Bar
{ };

auto barFunc = [] ( int n ) -> bool { return true; };

int main()
{
auto b = Bar<decltype(barFunc)>();
}


但请注意,lambda 不是默认可构造的,因此您可能需要添加更多代码来创建 Bar 的构造函数,该构造函数接受 lambda 的拷贝:

template <typename Function> 
class Bar
{
public:

Bar(Function f) : m_function(f)
{ }

private:

Function m_function;
};

关于C++模板非类型参数lambda函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16179528/

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