gpt4 book ai didi

c++ - `const` 到非 `const` 或非 `const` 到 `const`

转载 作者:行者123 更新时间:2023-11-28 00:12:14 32 4
gpt4 key购买 nike

下面的代码用于在同时存在 const 和非 const getter 时减少代码重复。它从非 const 创建 const 版本。我搜索了一下,很多人说我应该从 const 创建非 const 版本。

我的想法是,如果我从 const 版本创建非 const 版本,与下面的代码相反,取消引用返回的指针可能是不安全的,或者最初是 const 的引用。我真的不确定这一点,所以我要求澄清,正确的“方向”是什么?

template<typename T>
struct Constifier
{
typedef T Type;
};

template<typename T>
struct Constifier<T &>
{
typedef const T &Type;
};

template<typename T>
struct Constifier<T &&>
{
typedef const T &&Type;
};

template<typename T>
struct Constifier<T *>
{
typedef const T *Type;
};

template<typename F>
struct ReturnType;

template<typename R, typename ...Ts>
struct ReturnType<R (*)(Ts ...ts)>
{
typedef R Type;
};

template<typename R, typename T, typename ...Ts>
struct ReturnType<R (T::*)(Ts ...ts)>
{
typedef R Type;
};

template<typename T, typename F, typename ...Ts>
auto callConstVersion(const T *t, F f, Ts ...ts)
{
return const_cast<typename Constifier<typename ReturnType<F>::Type>::Type>((const_cast<T *>(t)->*f)(ts...));
}

struct A
{
A *p;
A *get() {return p;}
const A *get() const {return callConstVersion(this, static_cast<A *(A::*)()>(&A::get));}
};

最佳答案

您应该始终从const 版本创建non-const 版本,而不是以相反的方式。解释很简单,这样想:

您只能在非常量 对象上调用非常量 getter。如果对象是非常量,您可以在非常量 方法中安全地const_cast 您的const getter。为什么?因为您只能在 非常量 对象上调用此方法。

相反的做法并不安全,因为在 const 中调用 non-const 方法时,您无法确保常量性得以保留。

关于c++ - `const` 到非 `const` 或非 `const` 到 `const`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32426504/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com