【问题标题】:Add const to pointer type将 const 添加到指针类型
【发布时间】:2021-10-18 09:10:23
【问题描述】:

假设我有一个类模板:

template <class T>
struct A
{
  T value;

  void foo(auto fun) { 
    fun(value);
    // ^^^^^^^ Pass value as a const object
  }
};

我想在调用fun 时将 const 添加到value 以便只有接受 TT const&amp;T const* 的函数是可调用的。我最初的方法是让foo 成为一个 const 成员函数,但这对于引用和指针成员来说是失败的,因为 const 成员函数可以修改它们(你只是不能对这些成员进行变基)。

我还尝试使用std::add_conststd::as_const 将值传递给参数函数(fun),但这会产生如下转换:

T = MyData*                  // say T is the type "Pointer to MyData"
add_const<T> = MyData *const // constness is added to the pointer, 
                             // i.e. it becomes constant pointer to MyData

在上面的例子中我想要的目标类型是MyData const*(指向常量MyData的指针)。

  • 是否有实现此目的的标准工具?
  • 除了装饰电话fun(value),还有其他方法吗?

Demo

【问题讨论】:

    标签: c++ templates constants typetraits const-correctness


    【解决方案1】:

    你可以

    fun(static_cast<std::conditional_t<
                        std::is_pointer_v<T>,
                        std::add_pointer_t<std::add_const_t<std::remove_pointer_t<T>>>,
                        std::add_const_t<T>
                    >
                   >(value));
    

    那么当TMyData*时,转换后的类型为MyData const*;对于像MyData 这样的非指针类型,转换后的类型将是MyData const

    【讨论】:

    • 在演示中插入了扩展程序,它禁止了我想禁止的呼叫,很好。这让人想起 const_iterator 类型问题,我认为标准库会提供一些工具来解决它
    • @lorah 它没有,因为您的解决方案是对设计错误的补丁。统一处理 foo 和 foo 指针是代码异味。但你会活下来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多