2016-11-08 273 views
0

如果我聲明一個數組(使用C++類模板)像這樣,如何將數組對象(類模板C++)作爲參數傳遞給函數?

#include <array> //standard c++ library 
int main() 
{ 
array<int,3> myarray{10,20,30}; 
} 

如何將能夠這個數組對象發送到一個函數作爲參數。

如果我通過這樣的工作原理:

void f_print(array<int, 3> object){} 
int main() 
{ 
array<int, 3> myarray{10,20,30}; 
f_print(myarray); 
} 

但這裏的問題是,我硬編碼的大小的功能。整個工作就像這樣使用數組作爲對象類型,所以我可以使用array.size()。 那麼如何傳遞這個數組類型對象(C++類模板)而不需要硬編碼大小。

Edit_1:爲什麼我不能將數組對象作爲一個對象使用函數參數中對象的所有屬性發送。

+0

相關/ dupe:http:// stackoverflow。COM /問題/ 17156282 /傳球-A-stdarray-的未知大小到一個功能。儘管答案不是最大的粉絲。 – NathanOliver

+0

爲什麼我不能只將數組對象作爲對象發送。這實際上是我的查詢。 –

回答

4

使函數模板,以避免硬編碼它的大小:

template<size_t S> 
void f_print(array<int, S> object){} 

看到一個Live Demo

+0

爲什麼我不能僅將數組對象作爲對象發送。這實際上是我的查詢 –

+3

@JabedHossain因爲'std :: array'的每個模板參數組合形成它自己的類。這些不是真正相關的,不能被推斷爲數組對象。此外,如果這是你真正的問題,爲什麼你不把它放在你的問題? –

+0

非常感謝。這符合我好奇心。 –

5

您可以模板或者數組類型

template<typename T> 
void f_print(std::array<T, 3> const& object); 

或者大小

template<size_t S> 
void f_print(std::array<int, S> const& object); 

或兩項:

template<typename T, size_t S> 
void f_print(std::array<T, S> const& object); 

編譯器應該能夠推斷出正確的模板參數中所有的情況。

+1

我認爲選項D:模板接受容器的參數: 'template void f_print const T&object);' 也適合OP的需要 – AndyG

+0

爲什麼我不能將數組對象作爲唯一對象發送。這實際上是我的查詢 –

1

我認爲你錯過了數組的觀點。它的大小屬於大小,屬於。原始數組就是這種情況,std::array也是如此。在功能中硬編碼std::array<int, 3>的大小3與硬編碼int一樣不可避免。

事實上,在我的經驗,最好的方式思考約例如像int[4]std::array<int, 4>是爲int a, b, c, d的簡寫數組。

我想說一個模板只是以一種非常膚淺的方式繞開這個問題。如果您創建一個帶有size參數的模板,那麼對於不同的數組類型,您只會得到許多不同的函數。 std::array<int, 3>,std::array<int, 4>,std::array<int, 5>等都導致不同的模板實例化。這與您最終得到std::array<int, 3>,std::array<double, 3>std::array<std::string, 3>的不同模板實例的方式相同。

請注意,將大小轉換爲模板參數可能仍然是您正在尋找的解決方案實際上是。但是,如果您需要在編譯時未知大小的容器,請使用std::vector

+0

我知道我可以使用std :: vector,但我想知道,因爲我聲明類類型的對象數組爲什麼數組不會像對象一樣用作函數參數時的行爲。但謝謝你的答案。從中學習。 –

相關問題