如何获得对boost :: any持有的数据的const引用?

矩阵安德鲁

尝试boost::any通过boost::any_cast引用强制转换检索实例后,无法维护const正确性

我的代码:

MyMap paramMapToSet;
MyMap& paramMap = &paramMapToSet;
const MyMap& constParamMap = &paramMapToSet;

A hoe;
paramMap.set(hoe, "structA");

// this works
A& hoeRef = paramMap.getByRef<A>("structA");
hoeRef.myInt = 101;
cout << paramMap.get<A>("structA").myInt << endl; // prints 101

// as well as this:
hoe = constParamMap.get<A>("structA");
cout << hoe.myInt << endl;

// and this:
const A& constHoeRef = paramMap.getByRef<A>("structA");
cout << constHoeRef.myInt << endl;

// however this doesn't work, why?? (error message below)
const A& constHoeRef = constParamMap.getByRef<A>("structA");
cout << constHoeRef.myInt << endl;

对于最后一个版本为什么会产生错误,我也有些困惑。我收到的错误消息是这样的:

C:... \ boost_1_58_0 \ boost \ any.hpp:284:错误:C2440:'return':无法从'const nonref'转换为'A&'

第284行如下所示:

return any_cast<const nonref &>(const_cast<any &>(operand));

从下面的行中调用:

实现:

// a testing class:
struct A{
    int myInt;
    A() = default;
    A(const A& other) : myInt(other.myInt)
        { cout << "Class A is being copied" << endl; }
};

// any-map implementation
class MyMap{
public:
    template<typename T>
    T get(const std::string& path) const
    {
        return any_cast<T>(data.at(path));
    }

    template<typename T>
    const T& getByRef(const std::string& path) const
    {
        return any_cast<T&>(data.at(path)); // compiler originates the error from here
    }

    template<typename T>
    T& getByRef(const std::string& path)
    {
        return any_cast<T&>(data.at(path)); 
    }

    template<typename T>
    void set(T val, const std::string& path)
    {
        data[path] = val;
    }

private:
    std::map<std::string, boost::any> data;
};

您可能会认为MyMap提供了开箱即用的无用包装功能,但是实际的实现具有get / set方法,这些方法会在内部std :: map内部自动创建嵌套映射,从而提供了像数据结构这样的灵活灵活的DOM。

轨道轻度竞赛

我只是在猜测,但是,肯定是……

return any_cast<const T&>(data.at(path));
//              ^^^^^^

…不?

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用该对象持有的引用列表到自己的Java流打印嵌套列表

如何枚举TCategoryPanel持有的所有控件?

如何获取webview当前持有的网页标题?

获取当前持有的std :: variant的typeid(例如boost :: variant type())

如何将数据添加到 firebase 数据库中已有的引用?

持有对自己的引用时,如何调用变异方法?

如何获得所有的类方法

如何从boost获得平台ID?

拥有的数据正在获得终身

如何获得对viewmodel的引用

如何获得对 LinearLayout 的引用?

如何解决Rust中的“返回引用当前函数拥有的数据的值”错误?

我可以获得edittext的文本对象引用项的视图持有者吗?

如何将哈希值传递到无序映射中以减少持有的时间?

如何将CookieManager持有的cookie传递给Android中的Jsoup?

如何获取当前持有的变体类型,并定义该类型的新变量

如何将承诺转换为它持有的数组?

您如何访问由共享指针持有的类方法?

如何计算一个月内持有的最大金额?

如何设计用于持有Dominion卡的数据库?

如何获得const合格的declval?

如何获得对延迟功能的引用?

如何获得对右值的引用?

如何避免filter_map()在Rust中出现错误“返回引用当前函数拥有的数据的值”?

如何将实例数据复制到现有的类引用中/之上?C#

如何解决“返回引用当前函数拥有的数据的值”(结构之间的实际依赖关系)

如何从现有的动态代理获得“代理”对象

如何从Box中获得拥有的价值?

如何获得用户拥有的对象?