如何解决C ++替换:用v.atx替换v [x]的每次出现
在C ++中,对于向量v,v.at(x)
的行为类似于v[x]
,不同之处在于,如果访问不存在的元素,它将抛出超出范围的错误。
理想情况下,我想始终使用v.at(x)
,但是写起来不如v[x]
方便。有没有办法让v[x]
表现得像v.at(x)
,也许可以使用类似#define
的东西?
解决方法
您可以考虑按如下所示在新继承中重载该方法
#include <iostream>
#include <vector>
template< class T,class allocator = std::allocator<T>>
struct Vector : std::vector<T,allocator>{
using std::vector<T,allocator>::vector;
const T& operator[](size_t i)const{
return this -> at(i);
}
T& operator[](size_t i){
return this -> at(i);
}
};
template< class T>
Vector(size_t,T ) -> Vector<T>;//if u want to use c++17 deduction guides
int main()
{
std::vector<int> vec1(4,1);
std::cout << vec1[4];
Vector vec2(4,1);
std::cout << vec2[4];
}
,
您可以将带有操作符[]的代理对象与调用方法at()的对象一起使用。当然,这并不是您想要的,但是语法相似:您必须写at(v)[x]来代替v [x]。
概念证明:
#include <iostream>
#include <vector>
template<class T>
class AtProxy
{
public:
AtProxy(const AtProxy<T>& proxy) : m_obj{proxy.m_obj} {}
AtProxy(T& obj) : m_obj{obj} {}
typename T::reference operator [](size_t index)
{
return m_obj.at(index);
}
private:
T& m_obj;
};
template<class T>
AtProxy<T> at(T& v)
{
return AtProxy<T>(v);
}
int main()
{
try
{
std::vector<int> vec = {1,2,3,4,5};
for(size_t i = 0; i < 5; i++)
{
std::cout << i << std::endl;
at(vec)[i] = at(vec)[i + 1] + 1;
}
}
catch(std::exception& e)
{
std::cout << "exception: " << e.what() << std::endl;
}
std::cout << "ok" << std::endl;
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。