boost::const 和 non-const 的变体

Posted

技术标签:

【中文标题】boost::const 和 non-const 的变体【英文标题】:boost::variant of const and non-const 【发布时间】:2013-08-16 05:52:40 【问题描述】:

我想创建template< typename F > using T = boost::variant< F, F const >; 类型以将只读和读写可访问值存储到同一个std::vector< T >。但是我遇到了以下编程问题:

#include <iostream>
#include <cstdlib>

#include <boost/variant.hpp>

int main()

    using F = double;
    using CV = boost::variant< F const, F >;
    F const c = 0.0;
    CV C(c);
    F v = 0.0;
    CV V(v);
    std::cout << C.which() << ' ' << V.which() << std::endl; 
    return EXIT_SUCCESS;

输出:1 1。 如何存储F 类型值的const 版本?

【问题讨论】:

首先您最好了解为什么...然后寻找解决方案。我正在深入研究boost::variant 的内容,并发现要初始化不同的变体正确的初始化程序称为(即const 和非const),但它返回const 参数的无效索引。 index 是初始化器类型的一部分,它显然有一些错误(或者可能是特性)......所以你最好深入研究 boost::detail::variant::make_initializer_node 胆量来回答(它在 boost/variant/detail 的第 111 行附近/initializer.hpp) @zaufi 我会试试的。但这似乎太难理解了。 阅读(和理解)他人编写的代码是一项非常有用的技能……利用你的机会来开发它! :)) 【参考方案1】:

这不是解决方案,而是一些有用的东西:

#include <iostream>
#include <functional>
#include <cstdlib>

#include <boost/variant.hpp>

int main()

    using F = double;
    using CV = boost::variant< std::reference_wrapper< F const >, std::reference_wrapper< F > >;
    F const c = 0.0;
    CV C(std::ref(c));
    F v = 0.0;
    CV V(std::ref(v));
    std::cout << C.which() << ' ' << V.which() << std::endl; 
    return EXIT_SUCCESS;

这需要额外的空间来存储数据(如果有)。在某些情况下,它可能比问题的原始表述中的一个更合适。

【讨论】:

以上是关于boost::const 和 non-const 的变体的主要内容,如果未能解决你的问题,请参考以下文章

const_string 库问题

向下转换并同时从 const 转换为 non-const

在同个类中non-const插入const来减少重复

Multi-agent Path Planning with Non-constant Velocity Motion

为啥 boost::interprocess::managed_shared_ptr to non-const 不能转换为 managed_shared_ptr to const

C++之error: cannot bind non-const lvalue reference of type ‘myString&’ to an rvalue of type ‘mySt