2012-07-10 34 views
1

我想用C++模板實現一個非常簡單的事情。我想要構建一個通用符號函數,它可以處理sgn(x)的情況,其中x可以是doublestd::vector<double>(即返回包含結果的std::vector<double>)。爲了做到這一點,我使用的模板使用向量而不是雙打作爲輸入的模板

double f(double x) { 
    return (x>=0)?1.0:-1.0; 
}; 

template<typename T> 
T F(T x) { 
    // ? 
}; 

我想投的模板,或者使用f如果doublefor循環,如果std::vector<double>。不幸的是我的函數不使用任何算術運算符,並且條件運算符不能被重載。我應該如何繼續?

+0

爲什麼在這裏使用模板?你應該重載這個函數。 – 2012-07-10 12:18:42

回答

3

雖然重載是實現您想要的最佳方式,但並非 真的是使用C++標準庫的方式。

如果你想給一個函數應用到一個容器(無論是 變異他們或創建新的結果)的所有元素,使用std::transformstd::for_each與您要使用的功能。

std::vector<double> doubles, results; 
std::transform(begin(doubles), end(doubles), std::back_inserter(results), sgn); 

這個問題比目前的方法更好地分離。如果真的需要,只有 在整個容器上操作,而在所有其他 個案中使用迭代器和高階函數。

+0

謝謝,我不會在這裏重新發明輪子。對矢量應用函數是我所需要的,模板對此目的是無用的。 – vanna 2012-07-10 12:49:20

+0

@vanna好吧,'transform'等人**都是**模板。他們是完美的目的。 – pmr 2012-07-10 13:07:14

3

這是通過重載解決的,而不是模板。

double sign(double x) { 
    return x < 0.0 ? -1.0 : 
      x > 0.0 ? 1.0 : 0.0; 
}; 

std::vector<double> sign(std::vector<double> const& x) { 
    // ? 
}; 

這就是說,我懷疑sign函數是否對向量有意義。

順便說一下,這與問題標題中所指稱的「算術」與「非算術」功能無關。這種區別在C++中不存在。

+0

感謝您在符號函數中注意到我的錯誤。正如我指出的那樣,我不需要任何模板,重載將會很好。剛剛在這裏感到困惑。 – vanna 2012-07-10 12:51:16