我在下面有我的班級表。注意我實作 operator[] 的方式。我使用 decltype(auto) 作為回傳型別的原因是(至少據我所知)當您在行中兩次應用運算子(例如 my_table[i][j] )時,回傳的型別是不同的:第一個應用程式它將是一個 vector& 在第二個連續應用程式之后它將是 T。它運行良好,但令我驚訝的是,如果我按如下方式重寫 operator[] 它仍然可以正常作業:
vector<T>& operator[](size_t input) const{ return data[input]; }
問題是為什么?它如何回傳對 t[i][j] 中所請求元素的所需參考?
原始代碼:
template <typename T>
class Table{
public:
Table(size_t r_num, size_t c_num) : data(r_num , vector<T> (c_num, T{})) {}
decltype(auto) operator[](size_t input) const{
return data[input];
}
decltype(auto) operator[](size_t input){
return data[input];
}
void Resize(size_t r_num, size_t c_num){
data.resize(r_num);
for(auto& it : data)
it.resize(c_num);
}
pair<size_t,size_t> Size() const{
if(data.empty() || data[0].empty())
return pair{0, 0};
return pair{data.size(), data[0].size()};
}
private:
vector<vector<T>> data;
};
uj5u.com熱心網友回復:
my_table[i][j] = 3 本質上是一樣的:
auto& tmp = my_table[i];
tmp[j] = 3;
考慮到這一點,這兩者實際上是 100% 等效的:
vector<T>& operator[](size_t input) {
return data[input];
}
// same thing as
decltype(auto) operator[](size_t input) {
return data[input];
}
它們都回傳 a std::vector<int>&,第二個索引操作適用于該向量。
那么為什么需要使用decltype(auto)呢?這是因為auto去掉了參考:
auto operator[](size_t input) {
return data[input];
}
// same thing as
vector<T> operator[](size_t input) {
return data[input];
}
它回傳行的副本,并會阻止分配。
uj5u.com熱心網友回復:
我們有:
Table t;
t[i][j] = 7;
雖然第一個operator[]應用在 class 中多載Table(回傳:)vector<T>&,第二個operator[]將應用于 the vector<T>&,因此它已經是一個為 classvector而不是 class多載的運算子table。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346199.html
下一篇:帶有列舉模板引數的模板類的工廠
