假设我有一个类模板:
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)
?你可以
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
。