boost::any

boost::any,第1张

boost::any

boost::any

  • any是一种很特殊的容器,它只能容纳一个元素,但这个元素可以是任意的类型
  • 如果用any保持原始指针会造成内存泄漏,替代方法是使用智能指针来存入any容器
  • 不是所有的智能指针都可以作为any存储的对象,如scoped_ptr,它不能被拷贝,不符合any的类型要求
#include 

using namespace boost;

any a(10);
int n = any_cast(a);

// 获得值的引用,被用于左值
any_cast(a) = 20;
  • 如果要转换的类型不是any内部对象的类型,或者any不持有任何值(empty() == true),则这两个any_cast()函数会抛出一个bad_any_cast异常
try
{
    any a;
    // 转换将导致异常
    any_cast(a);
}
catch()
{
    ...
}
  • 当any以指针的方式传入any_cast()的时候,返回的指针类型与传入的any对象具有相同的属性。如果any不持有任何对象,则这两个any_cast()不会抛出异常,而是返回一个空指针
any a1, a2(2.0);
// 转为空的any对象
assert(any_cast(&a1) == nullptr);
// 错误
assert(any_cast(&a2) == nullptr);
  • 在any中保存指针时要特别小心,因为空指针对于any也是有效的值,在用any_cast()取值后必须要进行测试
std::string *ps = new std::string("abc");
any a = ps;
if (!a.empty() && any_cast(a))
{
    std::cout << *any_cast(a) << std::endl;
}

实现辅助函数

template
bool can_cast(any &a)
{
    return typeid(T) == a.type();
}

template
T& get(any &a)
{
    assert(can_cast(a));
    return *any_cast(&a);
}

template
T* get_pointer(any &a)
{
    return any_cast(&a);
}

// 智能指针
template
any make_ptr_any(T *p = 0)
{
    return any(shared_ptr(p));
}

template
std::shared_ptr& get_shared(any &a)
{
    assert(can_cast>(a));
    return *any_cast>(&a);
}

// 调用
assert(can_cast(b));
get(b) = 100;
*get_pointer(b) = 200;
any a = make_ptr_any(new string("long"));
std::cout << "print: " << *get_shared(a) << std::endl;

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5690813.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存