2017-04-23 31 views
0

我是新來的,所以我可能會錯過一些東西。我現在有這些代碼:如何在這個遞歸中實現向量?

#include <iostream> 

template<int ...> struct mySum; 
template<>struct 
mySum<> { 
    static const int value = 0; 
}; 
template<int i, int ... tail> struct 
mySum<i, tail...> { 
    static const int value = i + mySum<tail...>::value; 
}; 
int sum = mySum<1, 2, 3, 4, 5, 6, 7, 8>::value; 

int main() { 
    std::cout << sum << std::endl; 

    return 0; 
} 

正如你所看到的,我使用遞歸來獲取值作爲一個整數的總和。我怎樣才能修改這段代碼來接受一個向量並返回一個向量?

比如,我想通過2

1,2,3,4乘以整個矢量將返回2,4,6,8等..

還是有更好的方法遞歸地做到這一點?

編輯:模板的東西是不是必需的。只有遞歸。我只是認爲這可能與模板做到這一點...

+0

你不能用一個向量作爲模板參數。 – user463035818

+0

我明白了。所以我必須使用其他方法? – sdkk2

+0

爲什麼要在編譯時將矢量乘以2?爲什麼它需要遞歸? – user463035818

回答

-2

如果你想遞歸做到這一點,你必須使用函數int sum(...);(包括< stdarg.h>)。 (它命名爲可變參數函數)

模板只是爲了避免重寫事情的方式:所有的模板的東西是在編譯過程中更換:編譯後,模板不存在了。

因爲模板是在編譯時決定的,僅在編譯時(常量表達式)已知的表達式可以在其中使用。 定義的矢量不是恆定的,所以它們不能在模板中使用。

+0

沒有,通過「懶惰」我只是想說,編譯時間後,模板不存在了:編譯器通過其等效採用通常的類型替換模板功能。因此,它嚴格等價於爲模板中使用的每個類型/參數聲明和定義重載函數。 –

+0

你真的認爲模板適合懶惰的程序員嗎? – granmirupa

+0

所以,我不能使用模板。謝謝你提供的信息。我會嘗試使用更標準的方法。 – sdkk2