std::reference_wrapper不能很好地使用std::bind
std::reference_wrapper does not work nicely with std::bind
我正在尝试用std::bind模拟C++11 lambdas中的完美/移动捕获。在下面的函数中,我想通过左值或右值传递具有可变"operator()"的处理程序,根据需要复制或移动它并调用它。
template <typename Handler>
void foo (Handler&& h)
{
std::bind (
[] (Handler& h) { h (); },
std::forward<Handler> (h)
) ();
}
在大多数情况下,此代码运行良好,但当我使用std::ref包装处理程序时失败。http://coliru.stacked-crooked.com/a/b9c29b6ed6fb5aa8
int main ()
{
int i = 0;
auto x = [i] () mutable { std::cout << "i=" << ++i << "n"; };
foo (x); // OK
foo (std::move (x)); // OK
foo (std::ref (x)); // Error
return 0;
}
如果我创建自己的"reference_wrapper"实现,它就可以正常工作。http://coliru.stacked-crooked.com/a/6b302233ab86d9ad:
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;
}
是std::bind错误吗?
有没有可能让它用c++11编译,只使用std库类,而不重新设计自己的包装器?
std::bind
对std::reference_wrapper
有特殊处理。
您可以添加过载来处理:
template <typename T>
void foo (std::reference_wrapper<T> h)
{
std::bind ([] (T& t) { t(); }, h) ();
}
演示
相关文章:
- 使用 std::应用于 std::bind
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- std::bind on statd::array 的运算符 []
- std::bind c++ in if statement
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 试图克服 std::bind 编译错误
- c++ std::bind within function
- std::bind to void* to std::function
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 在调用 std::bind 的产品后意外调用析构函数
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 我们应该在使用 std::bind 应用之前检查一个不为空的函数吗?
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 对函数库中的语法感到困惑 std::bind
- 在模板类成员上使用 std::bind
- 如何将参数从函数传递给 std::bind
- 如何在C++中使用 std::bind 函数作为信号处理程序?
- std::bind() 参数列表中函子的执行顺序(可能与函数参数的求值顺序无关)
- 在模板函数参数中使用 std::bind