将右值引用传递到提升::in_place函数中
passing rvalue reference into boost::in_place function
我是C++中右值引用的新手,想学习如何在日常生活中使用它们。关于流行的用例,我有 2 个相关的问题:将右值引用与 boost::in_place 和 boost::bind 一起使用。
- 在 boost::in_place 中使用右值引用
考虑一个类,构造函数将右值引用作为参数:
struct A
: boost::noncopyable
{
A(int&&){}
};
现在让我们尝试为这个类创建 boost 可选变量:
void foo(int&& value)
{
boost::optional<A> opt;
// some code here
opt = boost::in_place(std::forward<int>(value)); //Error!
}
在这样的示例中传递 rvalue ref 的正确方法是什么。有没有像 boost::reference_wrapper 这样的解决方案
?- 使用右值引用将绑定函子传递给函数对象
另一个常见的用例是将 boost::bind 函子对象分配给 boost::function 对象。
void foo(int&&)
{
}
void bar()
{
boost::function<void(int&&)> func;
int x = 0;
func = boost::bind(foo, std::move(x)); // Compilation error (a)
func = boost::bind(foo, _1); // Compilation error too (b)
}
我知道指令 (a) 在第一次调用后可能会导致未定义的变量值,但指令 (b) 甚至没有这样的问题。但是如何正确编写此代码?
提升in_places本身不支持移动或 r 值引用。 但是,您可以创建一个继承自 boost::in_place_factory_base 的新类,并创建自己的类。 或者你可以使用支持置换函数的可选(如 folly::Optional)。
我不确定我是否建议这样做,但是您可以在boost中进行通用重载来处理它,如下所示:
#include <boost/optional.hpp>
#include <boost/utility/in_place_factory.hpp>
#include <folly/ApplyTuple.h>
namespace boost
{
template<class ... As>
struct rvalue_in_place : public in_place_factory_base
{
mutable std::tuple<As...> tup_;
rvalue_in_place(As ... as)
: tup_(std::forward<As>(as)...)
{
}
template< class T >
void apply ( void* address ) const
{
auto make = [address](As ... as) { new (address) T(std::forward<As>(as)...); };
folly::applyTuple(make, tup_);
}
};
template <class ... As>
rvalue_in_place<As&&...> in_place(As && ... a)
{
return rvalue_in_place<As&&...>(std::forward<As>(a)...);
}
}
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- IF-nesting in c++
- Gurobi GRBModel and GRBmodel in C++
- Tensorflow Hub in C++
- Centos7 g++ "to_string is not in a member of std"
- 标准::移动"in-place operation"
- 强制"in-place"施工
- Bit Shifting in Place
- In-place std::copy_if