【问题标题】:How to get reference to object from boost::any?如何从 boost::any 中获取对对象的引用?
【发布时间】:2016-07-20 01:01:11
【问题描述】:

我试图从一个对象的引用创建一个 boost::any,并在 boost::any_cast 之后在给定的方法内更改它。但调用后对象保持不变。这是我正在尝试的一个简单示例:

class Base
{
public:
    template<typename T>
    void method(T& data)
    {
        methodImpl(boost::any(data));
    }

protected:
    virtual void methodImpl(boost::any& data) = 0;
};

class Derived : public Base
{
private:
    void methodImpl(boost::any& data)
    {
        Parameter& param = boost::any_cast<Parameter&>(data);
        // Change param attributes...
    }
};

int main()
{
    Derived derived;
    Parameter param;

    derived.method(param);
    // param hasn't changed...
}

有没有一种简单的方法可以让它工作,还是我必须使用 boost::ref 和 boost::reference_wrapper?

【问题讨论】:

    标签: c++ boost reference type-erasure any


    【解决方案1】:

    根据 boost::any 的文档,它总是会复制你提供给它的内容:

    http://www.boost.org/doc/libs/1_58_0/doc/html/boost/any.html

    有关相关构造函数和赋值运算符的文档,请参见“说明”部分中的第 4 和第 8 项。

    【讨论】:

    • 所以,我期待它复制对对象的引用:T&
    • 我向你保证,它不会那样工作。如果您确实需要将泛型类型集中到一个类型无知的虚函数中,您可以考虑只使用 void*。如果您支持的泛型类型有一个公共基类,那么一定要使用它。您也许可以使用不同的设计来完全避免您的情况,我只是对您的代码库了解不足,无法提出任何建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 2012-12-25
    • 2017-12-02
    相关资源
    最近更新 更多