c++ - Setter of a lambda function? -
consider following dumb example :
class myclass { public: template <class function> inline double f(double x, function&& function) { return function(x); } }; with class, can call myclass::f(x, function), lambda function execute on x, (i hope) no overhead. question : equivalent function settable member of myclass ?
class myclass { public: inline double f(double x) { return _function(x); } // setter , type of protected member _function ? };
lambda functions (as other types of "callable" functions) can wrapped , stored using std::function template class, found in <functional> header. template parameter function signature syntax
returntype(argumenttype1, argumenttype2, ...) so in case whole function wrapper type becomes
std::function<double(double)> and thus, code becomes
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 "more" wrapper function pointers. might know, lambda functions can capture part of variable context, needs stored somewhere. std::function transparently.
note std::function not support overloaded signatures / templated call operators functors. when assigning functor call-operator signature t operator()(t value) std::function<double(double)>, can called signature. there no std::function<t(t)> (unless t known, such template parameter of class).
an alternative might more efficient in cases (you need benchmark / profile it), make whole class template class function type parameter being template parameter. can store function member:
template<typename function> class myclass { public: myclass(function && f) : _function(f) {} inline double f(double x) { return _function(x); } private: function _function; }; in order create such object, need specify template parameter, this:
auto mylambda = [](double x){ return x * 0.25; }; myclass<decltype(mylambda)> myobject { mylambda }; to avoid ugly syntactic overhead, add "maker" function takes advantage of template type deduction:
template<typename function> auto makemyclass(function && f) -> myclass<function> { return myclass<function>(f); } then, code becomes more readable, use of auto again:
auto mylambda = [](double x){ return x * 0.25; }; auto myobject = makemyclass(mylambda);
Comments
Post a Comment