Ara*_*dur 3 c++ lambda templates c++11
这有效:
#include <functional>
template < bool (*F)( int ) > class Foo {};
bool fooFunc( int n ) { return true; }
int main( int argc, char* argv[] )
{
auto a = Foo< fooFunc >();
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为你无法将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 >();
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为你不能使用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 >();
}
Run Code Online (Sandbox Code Playgroud)
那么如何创建一个能够接受lambda机箱作为模板非类型参数的模板类?
只需使用类型参数创建一个类模板,并decltype在实例化模板时用于推断lambda的类型.
#include <functional>
template <typename Function>
class Bar
{ };
auto barFunc = [] ( int n ) -> bool { return true; };
int main()
{
auto b = Bar<decltype(barFunc)>();
}
Run Code Online (Sandbox Code Playgroud)
但请注意,lambdas不是默认构造的,因此您可能需要添加更多代码来创建一个构造函数,Bar该构造函数接收lambda的副本:
template <typename Function>
class Bar
{
public:
Bar(Function f) : m_function(f)
{ }
private:
Function m_function;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3262 次 |
| 最近记录: |