我有一個關于使用 C 11 標準的函式的完整演繹的問題。基本上我應該創建一個函式,它接受一個看起來像矩陣(基本上是任何容器)的單個引數,其元素可以再次是任何容器,但要記住每一行的元素不一定需要相同的大小。例如,引數可以是雙端佇列的向量、經典的類 C 矩陣、向量的向量、向量的雙端佇列等等,你明白了。話說回來。函式本身需要為具有相同結構和元素型別的二維矩陣動態分配(使用分段而不是連續分配)記憶體,然后將給定矩陣中的所有元素復制到其中,最后回傳一個雙指標,您可以使用它來訪問矩陣的元素。話雖如此,我實際上不知道如何使用完全推導,以便函式實際上知道哪個型別是它必須回傳的雙指標。我想到的第一件事是使用這樣的東西:
template <typename MatrixType>
auto CreateMatrix (MatrixType M) -> decltype ...
其背后的邏輯是完全推導會找出必須回傳哪種型別的雙指標,但是三個點(...)是我停止的地方,我實際上不知道在那里寫什么。
當然,我可能會做這樣的事情:
template <typename MatrixType>
MatrixType** CreateMatrix (MatrixType M)
但它不使用扣除,因為這樣的呼叫:
std::vector<std::deque<double>> a = {...};
auto x = CreateMatrix(a);
如果不使用<double>
函式呼叫就無法作業,所以它不是一個完整的“問題解決”它只是一個廉價的技巧。
記憶體分配應該不難,我認為這很容易做到,但目前我被困在這里,不知道該怎么辦。
我感謝每一個幫助!
uj5u.com熱心網友回復:
我仍然不確定我是否理解你想要做什么。我將專注于實際問題:當容器可以由標準容器或 C 陣列組成時,如何從 2D 容器中推斷值型別?
您可以使用型別特征。標準容器有一個value_type
成員別名。當二維陣列作為指標傳遞時,T**
值型別為T
. 當陣列T[M][N]
通過參考傳遞時,值型別為T
:
template <typename T>
struct value_type { using type = typename T::value_type; };
template <typename T>
struct value_type< T*> { using type = T; };
template <typename T,size_t N>
struct value_type< T[N] > { using type = T;};
template <typename T>
struct value_type2d {
using type = typename value_type<typename value_type<T>::type>::type;
};
作為一個例子,我使用了一個簡單地回傳第一個元素的函式:
template <typename Matrix>
typename value_type2d<Matrix>::type foo(const Matrix& m) {
return m[0][0];
}
int main() {
std::vector<std::vector<double>> x{{42,1},{2,3}};
std::cout << foo(x) << "\n";
std::vector<std::deque<double>> y{{42,1},{2,3}};
std::cout << foo(x) << "\n";
int z[2][2] = {{42,1},{2,3}};
std::cout << foo(z) << "\n";
std::vector<std::string> w[2] = {{"42","1"},{"2","3"}};
std::cout << foo(x) << "\n";
}
現場演示
PS:是decltype( M[0][0] )
的,是一種更簡單的獲取值型別的方法。雖然例如std::map::operator[]
不是const
,當函式不修改引數時,您不應該傳遞非 const 參考。而且您當然不想復制整個矩陣只是為了將其傳遞給函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/464688.html
上一篇:臨時初始化和參考初始化