我想創造一個簡單的輔助算法,將填充的容器,如std::vector<T>
,具有幾何級數(第一項是a
,並且n
個術語由下式給出a * pow(r, n-1)
,其中r
是給定的比例);我創建了下面的代碼:使用模板的模板時失敗模板參數推導參數
#include<vector>
#include<algorithm>
#include<iostream>
template<template <typename> class Container, typename T>
void progression(Container<T>& container, T a, T ratio, size_t N) {
if(N > 0) {
T factor = T(1);
for(size_t k=0; k<N; k++) {
container.push_back(a * factor);
factor *= ratio;
}
}
}
int main() {
std::vector<double> r;
progression(r, 10.0, 0.8, static_cast<size_t>(10));
for(auto item : r) {
std::cout<<item<<std::endl;
}
return 0;
}
這在嘗試編譯產生了以下錯誤:
$ g++ geometric.cpp -std=c++11 # GCC 4.7.2 on OS X 10.7.4
geometric.cpp: In function ‘int main()’:
geometric.cpp:18:52: error: no matching function for call to ‘progression(std::vector<double>&, double, double, size_t)’
geometric.cpp:18:52: note: candidate is:
geometric.cpp:6:6: note: template<template<class> class Container, class T> void progression(Container<T>&, T, T, size_t)
geometric.cpp:6:6: note: template argument deduction/substitution failed:
geometric.cpp:18:52: error: wrong number of template arguments (2, should be 1)
geometric.cpp:5:36: error: provided for ‘template<class> class Container’
鏘的錯誤消息是更加微妙:
$ clang++ geometric.cpp -std=c++11 # clang 3.2 on OS X 10.7.4
geometric.cpp:18:3: error: no matching function for call to 'progression'
progression(r, 10, 0.8, 10);
^~~~~~~~~~~
geometric.cpp:6:6: note: candidate template ignored: failed template argument deduction
void progression(Container<T>& container, T a, T ratio, size_t N) {
^
1 error generated.
我本來期望的是使用模板模板參數我不僅能夠推導出容器,還能推導容器的value_type
(在這種情況下爲T
)。
所以,問題是:如何創建一個泛型函數,它將能夠推導出容器類型和值類型?
我相信我錯過了一些明顯的東西 - 我感謝您的耐心和幫助。
編輯(答案)
下面的代碼的行爲與預期:
#include<vector>
#include<algorithm>
#include<iostream>
template<template <typename...> class Container, typename T, typename... Args>
void progression(Container<Args...>& container, T a, T ratio, size_t N) {
if(N > 0) {
T factor = T(1);
for(size_t k=0; k<N; k++) {
container.push_back(a * factor);
factor *= ratio;
}
}
}
int main() {
std::vector<double> r;
progression(r, 10.0, 0.8, 10);
for(auto item : r) {
std::cout<<item<<std::endl;
}
return 0;
}
輸出:
10
8
6.4
5.12
4.096
3.2768
2.62144
2.09715
1.67772
1.34218
謝謝!這解決了這個問題。 – Escualo
我其實有這個答案的改進版本,但我的網絡連接斷開,我無法從我的手機進行編輯(它只是一團糟)。 –
@阿列塔:很高興幫助! –