3

这有效:

#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 封装作为模板非类型参数的模板类呢?

4

2 回答 2

6

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

#include <functional>

template <typename Function> 
class Bar 
{ };

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

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


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

template <typename Function> 
class Bar 
{ 
    public:

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

    private:

    Function m_function;
};
于 2013-04-23T21:33:41.243 回答
0

在您的第一个示例中,您需要添加一个指针,因为该函数没有衰减为一个。

int main( int argc, char** )
{
    auto a = Foo< std::add_pointer<decltype(fooFunc)>::type(0) >();
}
于 2013-04-23T21:43:44.910 回答