【问题标题】:Function for converting from T to const T in C++在 C++ 中从 T 转换为 const T 的函数
【发布时间】:2016-09-17 06:14:01
【问题描述】:

我想允许对我编写的容器类进行常量或非常量迭代。我的容器将元素存储在非const 引用的std::vector 中(称为elements)。我正在使用 Boost 的 transform iterator 来执行此操作,例如:

auto begin() const
{
    return boost::make_transform_iterator
        ( elements.begin()
        , to_const<std::reference_wrapper<ElementType>>
        );
}

这里我使用我编写的一个简单的函数模板将T 类型的对象转换为const T

template <typename T>
std::add_const<T>::type to_const(T value) { return value; }

我知道编写起来很简单,但我只是想知道是否已经有一个 STL 或 Boost 函数模板来执行此操作,类似于 std::add_const 但作为一个实际函数。 (或者,如果有人知道将可变向量延迟转换为常量向量的更好方法,那就更好了。)

【问题讨论】:

    标签: c++ boost vector stl constants


    【解决方案1】:

    在 C++17 中,有一个 &lt;utility&gt; 模板函数可以做到这一点,std::as_const&lt;T&gt;,顺便说一句,这(下)不是如何编写的。

    template <typename T>
    std::add_const<T>::type to_const(T value) { return value; }
    

    您正在按值获取参数,这允许临时变量,并且可能需要调用复制/移动构造函数;而是使用lvalue 引用(也就是对象不能是临时对象),原型如下:

    template <typename T>
    constexpr typename std::add_const<T>::type& as_const(T& t) noexcept{
        return t;
    }
    

    template <typename T>
    constexpr std::add_const_t<T>& as_const(T& t) noexcept{ return t; }
    

    【讨论】:

    • 完美。我忘记了诸如 constexpr 和参考参数之类的东西,这就是我想找到标准实现的原因。 :P
    • 为了完整起见,应该说这确实允许临时变量(如果它们是const)作为参数。
    • @JohannesSchaub-litb,由于这不是转发参考,因此只有在像std::as_const&lt;const T&gt;(A()) or ... std::as_const(static_cast&lt;const A&amp;&gt;(A())); 这样给出明确的模板参数时才能接受临时变量...但是为什么有人甚至想要这样做呢? ?
    • @WhiZTiM 我是说如果临时是const,则不需要显式模板参数。 Qt 有一些函数会返回 const 临时变量,例如 doc.qt.io/qt-5/qmap.html#operator-5b-5d-1
    • 这回答了我的问题,但我认为值得一提的是,我最终无法将此解决方案用于我的特定问题。问题是,如果我尝试将 std::as_const 作为函子传递,即使使用类型转换,它也无法判断要使用哪个重载。所以我最终只使用了 lambdas。
    猜你喜欢
    • 2011-01-18
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2013-10-20
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多