C++ std::reference_包装器不能很好地与std::bind一起工作
我试图用std::bind在C++11lambdas中模拟完美/移动捕获。在下面的函数中,我希望通过左值或右值传递带有可变“operator()”的处理程序,根据需要复制或移动它并调用它C++ std::reference_包装器不能很好地与std::bind一起工作,c++,c++11,C++,C++11,我试图用std::bind在C++11lambdas中模拟完美/移动捕获。在下面的函数中,我希望通过左值或右值传递带有可变“operator()”的处理程序,根据需要复制或移动它并调用它 template <typename Handler> void foo (Handler&& h) { std::bind ( [] (Handler& h) { h (); }, std::forward<Handler>
template <typename Handler>
void foo (Handler&& h)
{
std::bind (
[] (Handler& h) { h (); },
std::forward<Handler> (h)
) ();
}
模板
void foo(处理程序(&h)
{
绑定(
[](Handler&h){h();},
标准:正向(h)
) ();
}
这段代码在大多数情况下运行良好,但在使用std::ref包装处理程序时失败。
int main()
{
int i=0;
自动x=[i]()可变{std::cout decltype(t(std::forward(args)…)
{
返回t(标准:正向(参数)…);
}
};
模板内联my_reference_包装器
my_ref(T&T){return{T};}
int main()
{
int i=0;
auto x=[i]()可变{std::coutstd::bind
对reference\u包装有特殊处理
您可以添加重载来处理:
template <typename T>
void foo (std::reference_wrapper<T> h)
{
std::bind ([] (T& t) { t(); }, h) ();
}
模板
void foo(std::reference_包装器h)
{
绑定([](T&T){T();},h)();
}
template <typename T>
struct my_reference_wrapper
{
T& t;
template <typename ...As> auto
operator() (As&&... args) const -> decltype (t (std::forward<As> (args)...))
{
return t (std::forward<As> (args)...);
}
};
template <typename T> inline my_reference_wrapper<T>
my_ref (T& t) { return { t }; }
int main ()
{
int i = 0;
auto x = [i] () mutable { std::cout << "i=" << ++i << "\n"; };
foo (my_ref (x)); // Now OK
foo (my_ref (x)); // And even increments 'i' properly.
return 0;
}
template <typename T>
void foo (std::reference_wrapper<T> h)
{
std::bind ([] (T& t) { t(); }, h) ();
}