簡體   English   中英

我如何使用扣除來選擇function的返回類型

[英]How do i use deduction to choose the return type of function

我對使用 C++11 標准的函數進行完全推導有疑問。 基本上我應該制作一個 function,它采用一個看起來應該像矩陣(基本上是任何容器)的參數,其元素可以再次是任何容器,但請記住每一行的元素不一定需要相同的大小。 例如,參數可以是雙端隊列的向量、經典的類 C 矩陣、向量的向量、向量的雙端隊列等等,你明白了。 話說回來。 Function 本身需要動態分配(使用碎片而不是連續分配) memory 對於具有相同結構和元素類型的二維矩陣,然后將給定矩陣中的所有元素復制到其中,最后返回一個雙指針,您可以使用它來訪問矩陣的元素。 話雖如此,我實際上並不知道如何使用完全推導,以便 function 實際上知道哪種類型是它必須返回的雙指針。 我想到的第一件事是使用這樣的東西:

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);

如果不在 function 的調用中使用<double>將無法工作,所以它不是一個完整的“問題解決”,它只是一個廉價的技巧。

Memory 分配應該不難,我想這很容易做到,但目前我被困在這里,不知道該怎么辦。

我很感激每一個幫助!

我仍然不確定我是否理解你想做什么。 我將專注於實際問題:當容器可以由標准容器或 C arrays 制成時,如何從二維容器推斷值類型?

您可以使用類型特征。 標准容器有一個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;
};

作為示例,我使用了 function,它簡單地返回了第一個元素:

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 ,並且當 function 不修改參數時,您不應傳遞非 const 引用。 而且您當然不希望復制整個矩陣只是為了將其傳遞給 function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM