我想為陣列創建除錯模板以列印陣列。這是我的模板
#define debug(x) cerr << #x <<" = "; print(x); cerr << endl;
void print(ll t) {cerr << t;}
void print(int t) {cerr << t;}
void print(float t) {cerr << t;}
void print(string t) {cerr << t;}
void print(char t) {cerr << t;}
template <class T> void print(vector <T> v) {cerr << "[ "; for (T i : v) {print(i); cerr << " ";} cerr << "]";}
template <class T> void print(T arr[]) {cerr << "[ "; for (T i : arr) {print(i); cerr << " ";} cerr << "]";}
但是它給陣列提供了一些錯誤,但向量作業正常,
template <class T> void print(T arr[]) {cerr << "[ "; for (T i : arr) {print(i); cerr << " ";} cerr << "]";}
^~~
A.cpp:16:55: note: suggested alternatives:
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c \mingw32\bits\stdc .h:95:0,
from A.cpp:1:
c:\mingw\lib\gcc\mingw32\6.3.0\include\c \valarray:1206:5: note: 'std::begin'
begin(const valarray<_Tp>& __va)
^~~~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c \valarray:1206:5: note: 'std::begin'
A.cpp:16:55: error: 'end' was not declared in this scope
template <class T> void print(T arr[]) {cerr << "[ "; for (T i : arr) {print(i); cerr << " ";} cerr << "]";}
^~~
A.cpp:16:55: note: suggested alternatives:
In file included from c:\mingw\lib\gcc\mingw32\6.3.0\include\c \mingw32\bits\stdc .h:95:0,
from A.cpp:1:
c:\mingw\lib\gcc\mingw32\6.3.0\include\c \valarray:1226:5: note: 'std::end'
end(const valarray<_Tp>& __va)
^~~
c:\mingw\lib\gcc\mingw32\6.3.0\include\c \valarray:1226:5: note: 'std::end'
那么如何為陣列創建除錯呢?
uj5u.com熱心網友回復:
基于范圍的 for 回圈(for(T i : v)內部使用std::begin和std::end來確定它必須迭代的范圍。這些方法適用于大小在編譯時固定的陣列,例如int arr[10];,對于任何標準容器,例如std::vector,std::list,或任何具有回傳迭代器的.begin()and方法的類,我認為。.end()
但是,它不適用于指標。
事實上print(T arr[])等于print(T *arr)。當您只有一個指標時,您無法確定陣列的長度。您甚至無法確定此指標是否指向陣列。因此,您不能將基于范圍的 for 回圈與指標一起使用。
那么如何為陣列創建除錯呢?
如果要使用動態分配的陣列,則必須傳遞陣列大小
template <class T> void print(T v[], size_t size)
并使用正常的 for 回圈
for(size_t i = 0; i < size; i ) { ... }
另一種可能性是為陣列大小制作一個模板,如這個問題:有人可以解釋這個給我陣列大小的模板代碼嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496354.html
下一篇:帶有少量引數的模板函式的推導
