boost::anys::basic_any — 一个具有可自定义的小对象优化(Small Object Optimization)的类,其实例可以持有满足 ValueType 要求的任何类型的实例。如果不确定,请改用 boost::any。
// In header: <boost/any/basic_any.hpp> template<std::size_t OptimizeForSize, std::size_t OptimizeForAlignment> class basic_any { public: // public member functions basic_any() noexcept; template<typename ValueType> basic_any(const ValueType &); basic_any(const basic_any &); basic_any(basic_any &&) noexcept; template<typename ValueType> basic_any(ValueType &&, typename std::enable_if<!std::is_same< basic_any &, ValueType >::value >::type * = 0, typename std::enable_if<!std::is_const< ValueType >::value >::type * = 0); ~basic_any() noexcept; basic_any & swap(basic_any &) noexcept; basic_any & operator=(const basic_any &); basic_any & operator=(basic_any &&) noexcept; template<typename ValueType> basic_any & operator=(ValueType &&); bool empty() const noexcept; void clear() noexcept; const boost::typeindex::type_info & type() const noexcept; // public data members static std::size_t buffer_size; static std::size_t buffer_align; };
boost::anys::basic_any 是 boost::any 的即插即用替换项,它通过 OptimizeForSize
和 OptimizeForAlignment
模板参数控制小对象优化。
某些应用程序需要 boost::any 的功能,并且知道存储对象的典型/最大大小,希望避免动态内存分配的开销。为了方便这些应用程序,可以创建一个 boost::anys::basic_any 的类型别名,并将 OptimizeForSize
和 OptimizeForAlignment
模板参数分别设置为典型/最大大小和对齐方式。存储不抛出移动构造(nothrow move constructible)且大小和对齐方式小于等于 OptimizeForSize
和 OptimizeForAlignment
值的类型时,将避免内存分配。
否则,请直接使用 boost::any。
basic_any
公有成员函数basic_any() noexcept;
后置条件 |
this->empty() 为 |
template<typename ValueType> basic_any(const ValueType & value);
复制 value
,使新实例的初始内容在类型和值上都等同于 value
。
如果 ValueType
是不抛出移动构造的,并且 sizeof(value) <= OptimizeForSize
和 alignof(value) <= OptimizeForAlignment
,则不进行动态分配。
抛出 |
std::bad_alloc 或包含类型的复制构造函数引起的任何异常。 |
basic_any(const basic_any & other);
复制构造函数,将 other
的内容复制到新实例中,使任何内容在类型和值上都等同于 other
的内容,或者如果 other
为空则为空。
抛出 |
可能因 std::bad_alloc 异常或包含类型的复制构造函数引起的任何异常而失败。 |
basic_any(basic_any && other) noexcept;
移动构造函数,将 other
的内容移动到新实例中,并使 other
为空。
后置条件 |
other->empty() 为 |
抛出 |
无。 |
template<typename ValueType> basic_any(ValueType && value, typename std::enable_if<!std::is_same< basic_any &, ValueType >::value >::type * = 0, typename std::enable_if<!std::is_const< ValueType >::value >::type * = 0);
转发(forward) value
,使新实例的初始内容在类型和值上都等同于转发前的 value
。
如果 ValueType
是不抛出移动构造的,并且 sizeof(value) <= OptimizeForSize
和 alignof(value) <= OptimizeForAlignment
,则不进行动态分配。
抛出 |
std::bad_alloc 或包含类型的移动构造函数或复制构造函数引起的任何异常。 |
~basic_any() noexcept;
释放实例管理所使用的所有资源。
抛出 |
无。 |
basic_any & swap(basic_any & rhs) noexcept;
交换 *this
和 rhs
的内容。
返回 |
|
抛出 |
无。 |
basic_any & operator=(const basic_any & rhs);
将 rhs
的内容复制到当前实例中,丢弃先前的内容,使新内容在类型和值上都等同于 rhs
的内容,或者如果 rhs.empty()
则为空。
抛出 |
std::bad_alloc 或包含类型的复制构造函数引起的任何异常。赋值满足强异常安全保证。 |
basic_any & operator=(basic_any && rhs) noexcept;
将 rhs
的内容移动到当前实例中,丢弃先前的内容,使新内容在类型和值上都等同于移动前的 rhs
的内容,或者如果 rhs.empty()
则为空。
后置条件 |
|
抛出 |
无。 |
template<typename ValueType> basic_any & operator=(ValueType && rhs);
转发(forward) rhs
,丢弃先前的内容,使新内容在类型和值上都等同于转发前的 rhs
。
如果 ValueType
是不抛出移动构造的,并且 sizeof(value) <= OptimizeForSize
和 alignof(value) <= OptimizeForAlignment
,则不进行动态分配。
抛出 |
std::bad_alloc 或包含类型的移动构造函数或复制构造函数引起的任何异常。赋值满足强异常安全保证。 |
bool empty() const noexcept;
返回 |
如果实例为空,则为 |
抛出 |
无。 |
void clear() noexcept;
后置条件 |
this->empty() 为 |
const boost::typeindex::type_info & type() const noexcept;
对于在编译时或运行时才知道的类型进行查询非常有用。
返回 |
如果实例非空,则为包含值的 |