如何将 const 添加到指向类型?

问题描述 投票:0回答:1

假设我有一个类模板:

template <class T>
struct A
{
  T value;

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

我想在调用

value
时向 
fun 添加 const,这样只有接受
T
T const&
T const*
的函数才可调用。我最初的方法是使
foo
成为 const 成员函数,但这对于引用和指针成员来说是失败的,因为 const 成员函数可以修改它们(你只是不能对这些成员进行变基)。

我还尝试使用

std::add_const
std::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)

演示

c++ templates constants type-traits const-correctness
1个回答
5
投票

你可以

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));

那么当

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

© www.soinside.com 2019 - 2024. All rights reserved.