访问成员变量时添加常量
Add const when accessing member variable
我需要一个围绕数据结构的透明包装器来添加一些属性。最简单的是这样的东西:
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*"作为对数据的访问。value丢弃了数据的常量,我可以像一样操作它
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.value,但这似乎仍然容易出错。(例如,像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];
};
相关文章:
- 将常量字符串添加到非常量字符串是否会给出常量字符串
- interpret_cast添加常量
- 减去常量或将常量添加到大数组中
- 将上一行添加到 char* 数组中的 char* 常量
- 将常量添加到函数模板指针参数
- 将常量添加到引用
- 强制实施调用函数应向被调用函数返回的值添加常量的规则
- 如何将常量限定符添加到 vector<>::p ointer?
- 我应该在源文件之间共享的常量的定义中添加关键字"extern"吗
- 在多项式类中重载 += 运算符,用于添加多项式和常量
- C++static_cast添加常量和"this"对象的const_cast有什么区别?
- 恒常性添加无效?错误:无法使用字符**初始化常量字符**
- 如何将常量传递给我的动态数组类添加方法
- 如何在模板中添加常量限定符
- 向成员函数添加常量限定符
- 是为添加常量而重新创建的对象/引用/指针
- c++中没有匹配的函数:给调用函数添加常量标签
- 尝试向迭代器中添加常量时链接器错误
- 为什么在int8_t中添加常量会将其提升为更大的类型
- 访问成员变量时添加常量