gpt4 book ai didi

c++ - 访问成员变量时加上const

转载 作者:行者123 更新时间:2023-11-28 02:24:47 25 4
gpt4 key购买 nike

我需要一个围绕数据结构的透明包装器来添加一些属性。最简单的是这样的:

template<typename T>
struct Wrapper{
T values;
}

现在我想将其传递给访问器并保持常量。基地将是:

template<class T>
T& accVal(usigned idx, T* vals){ return vals[idx]; }
template<class T>
const T& accVal(usigned idx, const T* vals){ return vals[idx]; }

template<class T>
auto
acc(unsigned idx, T& data) -> decltype(accVal(idx, data.values))
{
return accVal(idx, data.values);
}

//Example:
Wrapper<int*> intsWrapped;
cout << acc(1, intsWrapped);

这仅适用于非指针,比如用结构替换“T*”,因为对 data.values 的访问会丢弃数据的常量性,我将能够像这样操作它:

void foo(const Wrapper<int*>& bar){ acc(1, bar) = 5; }

这在我的应用程序中很危险。

那么我怎样才能保持常量呢?我试过这样的事情:

template< class T_Base, typename T_Mem >
struct GetConstCorrect
{
template< typename T >
struct AddConstVal: std::add_const<T>{};

template< typename T >
struct AddConstVal<T&>
{
using type = std::add_const_t<T> &;
};

template< typename T >
struct AddConstVal<T*>
{
using type = std::add_const_t<T>*;
};

template< typename T >
struct AddConstVal<T* const>
{
using type = std::add_const_t<T>* const;
};

template< typename T >
struct AddConstVal<T*&>
{
using type = std::add_const_t<T>*&;
};

template< typename T >
struct AddConstVal<T*const &>
{
using type = std::add_const_t<T>* const &;
};

using Base = T_Base;
using Mem = T_Mem;

static constexpr bool isConst = std::is_const<Base>::value;
using type = std::conditional_t< isConst,
typename AddConstVal<Mem>::type,
Mem
>;
};

template< class T_Base, typename T_Mem >
using GetConstCorrect_t = typename GetConstCorrect< T_Base, T_Mem >::type;

template< class T_Base, typename T_Mem >
GetConstCorrect_t< T_Base, T_Mem& >
getConstCorrect(T_Mem& mem)
{
return const_cast<GetConstCorrect_t< T_Base, T_Mem& >>(mem);
}

并通过 getConstCorrect(data.values) 访问 data.values,但这似乎仍然容易出错。 (例如,像 int** 这样的多指针会变成 intconst 而不是 int const**)

有没有更好的方法来实现这一点?

最佳答案

在有人提出更好的解决方案之前,我认为这就是答案:使用 AddConstVal 作为递归元函数,它一个一个地删除所有修饰符,调用自身并读取修饰符。

template< typename T >
struct AddConstVal: std::add_const<T>{};

template< typename T >
using AddConstVal_t = typename AddConstVal<T>::type;

template< typename T >
struct AddConstVal<T&>
{
using type = AddConstVal_t<T>&;
};

template< typename T >
struct AddConstVal<T*>
{
using type = AddConstVal_t<T>*;
};

template< typename T >
struct AddConstVal<T const>
{
using type = AddConstVal_t<T> const;
};

template< typename T >
struct AddConstVal<T volatile>
{
using type = AddConstVal_t<T> volatile;
};

template< typename T >
struct AddConstVal<T []>
{
using type = AddConstVal_t<T> [];
};

template< typename T, size_t N >
struct AddConstVal<T [N]>
{
using type = AddConstVal_t<T> [N];
};

关于c++ - 访问成员变量时加上const,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31115980/

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