Boost C++ 库

……世界上最受推崇、设计最精巧的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ Coding Standards

类模板 basic_any - Boost C++ 函数库
PrevUpHomeNext

类模板 basic_any

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_anyboost::any 的即插即用替换项,它通过 OptimizeForSizeOptimizeForAlignment 模板参数控制小对象优化。

某些应用程序需要 boost::any 的功能,并且知道存储对象的典型/最大大小,希望避免动态内存分配的开销。为了方便这些应用程序,可以创建一个 boost::anys::basic_any 的类型别名,并将 OptimizeForSizeOptimizeForAlignment 模板参数分别设置为典型/最大大小和对齐方式。存储不抛出移动构造(nothrow move constructible)且大小和对齐方式小于等于 OptimizeForSizeOptimizeForAlignment 值的类型时,将避免内存分配。

否则,请直接使用 boost::any

basic_any 公有成员函数

  1. basic_any() noexcept;

    后置条件

    this->empty()true

  2. template<typename ValueType> basic_any(const ValueType & value);

    复制 value,使新实例的初始内容在类型和值上都等同于 value

    如果 ValueType 是不抛出移动构造的,并且 sizeof(value) <= OptimizeForSizealignof(value) <= OptimizeForAlignment,则不进行动态分配。

    抛出

    std::bad_alloc 或包含类型的复制构造函数引起的任何异常。
  3. basic_any(const basic_any & other);

    复制构造函数,将 other 的内容复制到新实例中,使任何内容在类型和值上都等同于 other 的内容,或者如果 other 为空则为空。

    抛出

    可能因 std::bad_alloc 异常或包含类型的复制构造函数引起的任何异常而失败。
  4. basic_any(basic_any && other) noexcept;

    移动构造函数,将 other 的内容移动到新实例中,并使 other 为空。

    后置条件

    other->empty()true

    抛出

    无。
  5. 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) <= OptimizeForSizealignof(value) <= OptimizeForAlignment,则不进行动态分配。

    抛出

    std::bad_alloc 或包含类型的移动构造函数或复制构造函数引起的任何异常。
  6. ~basic_any() noexcept;

    释放实例管理所使用的所有资源。

    抛出

    无。
  7. basic_any & swap(basic_any & rhs) noexcept;

    交换 *thisrhs 的内容。

    返回

    *this

    抛出

    无。
  8. basic_any & operator=(const basic_any & rhs);

    rhs 的内容复制到当前实例中,丢弃先前的内容,使新内容在类型和值上都等同于 rhs 的内容,或者如果 rhs.empty() 则为空。

    抛出

    std::bad_alloc 或包含类型的复制构造函数引起的任何异常。赋值满足强异常安全保证。
  9. basic_any & operator=(basic_any && rhs) noexcept;

    rhs 的内容移动到当前实例中,丢弃先前的内容,使新内容在类型和值上都等同于移动前的 rhs 的内容,或者如果 rhs.empty() 则为空。

    后置条件

    rhs->empty()true

    抛出

    无。
  10. template<typename ValueType> basic_any & operator=(ValueType && rhs);

    转发(forward) rhs,丢弃先前的内容,使新内容在类型和值上都等同于转发前的 rhs

    如果 ValueType 是不抛出移动构造的,并且 sizeof(value) <= OptimizeForSizealignof(value) <= OptimizeForAlignment,则不进行动态分配。

    抛出

    std::bad_alloc 或包含类型的移动构造函数或复制构造函数引起的任何异常。赋值满足强异常安全保证。
  11. bool empty() const noexcept;

    返回

    如果实例为空,则为 true,否则为 false

    抛出

    无。
  12. void clear() noexcept;

    后置条件

    this->empty()true

  13. const boost::typeindex::type_info & type() const noexcept;

    对于在编译时或运行时才知道的类型进行查询非常有用。

    返回

    如果实例非空,则为包含值的 typeid,否则为 typeid(void)


PrevUpHomeNext