C++ 11std::protect
ile birlikte kullanmak için std::bind
birlikte kullanım yok mu?Neden std :: protect yok?
Boost.Bindboost::bind
tanımak ve değerlendirmek kalmaması onun argüman sarar bir boost::protect
yardımcısı sağlar. std::[c]ref
, çoğu zaman yeterince iyi bir yedek olacaktır, ancak argüman olarak bir rvalue almaz. Bunun uygulanmadı neden farkında değilim, Eh
#include <type_traits>
#include <functional>
int add(int a, int b)
{ return a + b; }
struct invoke_with_42
{
template <typename FunObj>
auto operator()(FunObj&& fun_obj) const -> decltype((fun_obj(42)))
{ return fun_obj(42); }
};
int main()
{
//// Nested bind expression evaluated
//auto bind_expr =
// std::bind<int>(invoke_with_42{}
// , std::bind(&add, 1, std::placeholders::_1));
//// Compilation error, cref does not take rvalues
//auto bind_expr =
// std::bind<int>(invoke_with_42{}
// , std::cref(std::bind(&add, 1, std::placeholders::_1)));
//// Ok, inner_bind_expr must be kept alive
auto inner_bind_expr =
std::bind(&add, 1, std::placeholders::_1);
auto outer_bind_expr =
std::bind<int>(invoke_with_42{}, std::cref(inner_bind_expr));
//// Ok, with protect
//auto bind_expr =
// std::bind<int>(invoke_with_42{}
// , std::protect(std::bind(&add, 1, std::placeholders::_1)));
}
Önerilen miydi? –
Bir “rıhtım” üzerindeki bir “cref” muhtemelen büyük olasılıkla felaket olurdu - geçici ömürler, “bind” nesnesine geçirildiği sürece (ya da her neyse) geçtiği sürece onu küçük tutar. – Yakk
Ayrıca, çalışma zamanı yükünü eklese de, 'bind' sonucunu' std :: function' olarak atayarak "koruyabilirsiniz". – Potatoswatter