如何实现const_auto,因为c++ 11缺少它
How does one achieve const_auto, since C++11 lacks it?
c++ 11的auto
类型很方便,所以现在人们也想要一个const_auto
类型。例如,假设std::list<T> a;
,如果
auto p = a.begin();
具有类型std::list<T>::iterator
,则希望
const_auto p = a.begin();
的类型为std::list<T>::const_iterator
。不幸的是,c++ 11似乎没有听说过const_auto
。因此,一个人如何才能以好的风格达到预期的效果呢?
c++ 11允许你写
const auto p = a.begin();
然而,这并不是你想要的。这使得一个常规迭代器指向不能更改值的非常量数据。
右边a.begin()
的类型是由a
的类型决定的,而不是由左边的任何东西决定的。如果a是非const,则调用a.begin()
的非const版本。因此,您可以将a
强制转换为const&然后使用它,或者你可以给a做一个常量引用并使用它:
const auto& b = a;
auto p = b.begin();
但是,更简单的方法是使用新引入的.cbegin()和.cend():
auto p = a.cbegin();
我经常发现将实例转换为其类型的const
版本很有用,但我发现使用const_cast
用于此目的是庸俗的(保留删除 const
,现在搜索它会发现危险的代码),而且它过于冗长(重复完整的类型?嗨!)
因此这个片段:
template<typename T>
T const& as_const( T& t ) { return t; }
,然后你可以用它来解决你的问题,如下所示:
auto p = as_const(a).begin();
我认为这是很好的自我记录。
c++ 11中有STL容器和C数组的函数模板。参见std::begin()
和std::end()
。不幸的是,由于某些原因,没有等效的std::cbegin()
或std::cend()
。
你可以使用这些函数来做你想做的事情:
template<class T, size_t N>
T const * cbegin(T(&a)[N])
{
return &a[0];
}
template<class T, size_t N>
T const * cend(T(&a)[N])
{
return &a[N];
}
template<class T>
typename T::const_iterator cbegin(T const & container)
{
return container.cbegin();
}
template<class T>
typename T::const_iterator cend(T const & container)
{
return container.cend();
}
后两个也可以声明为:
template<class T>
auto cbegin(T const & container) -> decltype(container.cbegin())
{
return container.cbegin();
}
template<class T>
auto cend(T const & container) -> decltype(container.cend())
{
return container.cend();
}
你可以这样做:
char x[] = "ab";
auto b = cbegin(x);
auto e = cend(x);
相关文章:
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 程序无法启动,因为缺少 libmpc-3.dll
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 无法为 X.radio 创建中等可视化,因为找不到网络节点可视化 - Omnet++
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- C++ 程序不会因为内存而终止
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- 无法使用 openssl 服务器,因为密码已过时...什么的...ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- "this"关键字在C++中的实现限制,因为它与危险但功能示例有关
- 系统错误:程序无法启动,因为您的计算机中缺少MSVCP140D.DLL。尝试重新安装该程序以解决此问题
- 如何读取指针的值,因为这个指针是函数的返回?
- 无法加载 QML 插件:无法保护模块,因为它从未注册过
- 无法使用犰狳运行编译的 cpp 代码,因为 dyld:库未加载
- system() 无法运行我的程序,因为空间
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 我必须构建我的项目 2 次,第一次失败,因为它无法打开库
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00