c – lambda函数的setter?
考虑以下愚蠢的例子:
class MyClass { public: template <class Function> inline double f(double x,Function&& function) { return function(x); } }; 有了这个类,我可以调用MyClass :: f(x,function),使用lambda函数在x上执行它,(我希望)没有开销.我的问题是:作为MyClass的可设置成员的功能是什么? class MyClass { public: inline double f(double x) { return _function(x); } // What are the setter and the type of the protected member _function ? }; 解决方法
可以使用在< functional>中找到的
std::function 模板类来包装和存储Lambda函数(以及一些其他类型的“可调用”函数).头.其模板参数是具有语法的函数签名
ReturnType(ArgumentType1,ArgumentType2,...) 所以在你的情况下,整个函数包装器类型变为 std::function<double(double)> 因此,你的代码就变成了 class MyClass { public: inline double f(double x) { return _function(x); } void setFunction(std::function<double(double)> && f) { _function = f; } private: std::function<double(double)> _function; }; std :: function比函数指针的包装器“更多”.您可能知道,lambda函数可以捕获变量上下文的一部分,需要将其存储在某处. std :: function透明地为你做这件事. 请注意,std :: function不支持仿函数的重载签名/模板化调用操作符.当将带有调用操作符(如T operator()(T值))的仿函数分配给std :: function< double(double)>时,只能使用此签名调用它.所以没有std :: function< T(T)> (除非T已知,例如您班级的模板参数). 在某些情况下(您需要对其进行基准测试/分析)可能更有效的替代方法是使整个类成为模板类,其中函数类型参数是模板参数.然后您可以将函数存储为成员: template<typename Function> class MyClass { public: MyClass(Function && f) : _function(f) {} inline double f(double x) { return _function(x); } private: Function _function; }; 要创建这样的对象,您需要指定模板参数,如下所示: auto myLambda = [](double x){ return x * 0.25; }; MyClass<decltype(myLambda)> myObject { myLambda }; 为了避免这种丑陋的句法开销,添加一个利用模板类型推导的“制造商”功能: template<typename Function> auto makeMyClass(Function && f) -> MyClass<Function> { return MyClass<Function>(f); } 然后,代码变得更易读,再次使用auto: auto myLambda = [](double x){ return x * 0.25; }; auto myObject = makeMyClass(myLambda); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 指针变量的初始化,C语言指针变量初始化详解
- 仿百度文库方案[openoffice.org 3+swftools+flexpaper] 使用
- React Native网络请求
- swift – 为什么Realm使用RealmOptional而不是Int?可选属性
- c# – 我被黑了.上传的Evil aspx文件名为AspxSpy.他们还在努
- ruby-on-rails – 使用RSpec测试布局
- Why fastjson so fast?
- 数据库设计 – 使用MongoDB的类似Twitter的应用程序
- 为什么regexec()在posix c总是返回第一个匹配,怎么能返回所
- ruby-on-rails-3 – Rails 3.2:仅针对Sidekiq worker的Gem