c++模板非类型参数lambda函数
c++ template non-type argument lambda function
这行得通:
#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) >();
}
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++:Lambda 函数指针转换的用例是什么?
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- 传递 lambda 函数的权衡是什么?
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 不是 lambda 函数中的常量表达式
- 如何使用可变参数数重载 lambda 函数?
- 如何通过指针传递lambda函数?
- 使用带有 lambda 函数指针的模板
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- C++ 中 Lambda 函数中的溢出
- 将数组传递到 lambda 函数中
- lambda 函数未显示正确的结果