将 const 添加到指针类型

Add const to pointer type

假设我有一个 class 模板:

template <class T>
struct A
{
  T value;

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

我想在调用 fun 时将 const 添加到 value,以便仅接受 T、[=15 的函数=], 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 的指针)。

Demo

你可以

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.