请帮助我了解Boost :: Any

用户名

Boost::Any使用placehoder从其派生模板化holder的通用基类。placehoder提供具有虚拟方法的接口,尤其是检索任何any的typeid的方法。然后,any包含指向的指针placeholder我不了解placeholder虚拟方法的目的和使用。让这个简化的构造为any(其接口的源在这里):

class any
{
public:
    template<typename ValueType>
    any(const ValueType & value) : content(new holder<ValueType>>(value)) {}

private:
    class placeholder
    {
    public:
        virtual const std::type_info & type_info() const = 0;
    };

    template<typename ValueType>
    class holder : public placeholder
    {
    public:
        holder(const ValueType &value) : held(value) {};
        virtual const std::type_info &type_info() const
        {
            return typeid(ValueType);
        }
        const value_type held;
    };

    placeholder *content;
}

在我看来,placeholder可以完全删除并placeholder *content;替换为holder *content;

此外,我不了解中使用的分配机制any让 :

any & operator=(any rhs)
{
    any(rhs).swap(*this);
    return *this;
}

这意味着any另一个。这将建立一个临时anyrhscontent以及swap它与当前对象,有效地做我们想要什么,但...什么成为这一切的点,如果any只是系统地构建了一个新的,暂时的any,它会影响到当前对象的所有分配操作?

迈克尔·安德森

在我看来,占位符可以完全删除并且占位符* content; 替换为所有者* content;。

不,由于holder是模板类,因此无效:

holder * content

你需要写

holder<T> * content

但您不知道T-(这是重点boost::any)。因此,您可以为所有holder<T>创建一个通用的基类-这就是事实placeholder

而且,我不理解任何使用的分配机制。让 :

any & operator=(any rhs)
{
    any(rhs).swap(*this);
    return *this;
}

这是众所周知的“复制和交换”习惯用法。考虑一下更标准的实现是什么样的:

any & operator=(const any &rhs)
{
    //Watch out for self-assignment.
    if(&any==this) return *this;

    //Clean out the old data
    delete content;

    // Update our content
    content = rhs.content->clone();

    return *this;
}

这在复制构造函数中重复了很多行为。复制和交换习惯是删除重复项的一种方法。复制是由复制构造函数完成的,清理是由临时析构函数完成的。

我确实认为奇怪的是,operator=由于不接受const引用,所以将副本作为其参数,然后从该副本创建第二个副本。我本来期望:

any & operator=(const any & rhs)
{
    any(rhs).swap(*this);
    return *this;
}

或者

any & operator=(any rhs)
{
    rhs.swap(*this);
    return *this;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

请帮助我了解Boost :: Any

来自分类Dev

请帮助我了解数组

来自分类Dev

请帮助我了解以下CSS代码

来自分类Dev

Javascript:请帮助我了解此功能

来自分类Dev

请帮助我了解Java中的Pusher websocket API

来自分类Dev

请帮助我了解AVL树中的LR旋转

来自分类Dev

请帮助我了解WDS和漫游

来自分类Dev

请帮助我了解这个基本的C ++类实现

来自分类Dev

Python:请帮助我了解此范围问题

来自分类Dev

我破坏了与Dotfuscator的兼容性...请帮助我了解如何

来自分类Dev

请帮助我了解VLAN是否可以满足我的需求

来自分类Dev

请帮助我了解Python中的装饰器(Fibonnacci +记忆)

来自分类Dev

请帮助我了解C语言中不熟悉的结构语法

来自分类Dev

使用函数进行算术运算时,请帮助我了解意外的结果

来自分类Dev

请帮助我了解链表C ++中的运算符重载=

来自分类Dev

请帮助我了解为什么要这么做

来自分类Dev

请帮助我了解如何实现Objective-C单例

来自分类Dev

classCastException请以实际概念帮助我

来自分类Dev

放大阵列,请帮助我

来自分类Dev

硬盘分区:请帮助我!:(

来自分类Dev

请帮助我:修改iframe内容

来自分类Dev

请帮助我摆脱这个问题

来自分类Dev

你能帮助我使用〜any()来理解这2条Matlab行吗

来自分类Dev

Scala:帮助我了解列表效果

来自分类Dev

.htaccess-帮助我了解行为

来自分类Dev

请帮助我了解为什么一个简单的更改会破坏我的撰写/管道功能

来自分类Dev

我不知道错了,请帮助我

来自分类Dev

我正在实现拖放功能,请帮助我。

来自分类Dev

我不知道错了,请帮助我