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

c++ template non-type argument lambda function

本文关键字:lambda 函数 类型参数 c++      更新时间:2023-10-16

这行得通:

#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;
};

在你的第一个例子中,你需要添加一个指针,因为函数没有衰减成一个。

int main( int argc, char** )
{
    auto a = Foo< std::add_pointer<decltype(fooFunc)>::type(0) >();
}