[英]Comparing 2 values using template metaprogramming C++
我希望有一個默認功能作為“謂詞”模板,以防用戶不提供。 到目前為止,我一直在做類似的事情:
template<typename T>
struct simple_compare{
bool operator()(T const& a, T const& b){
return a > b;
}
};
template<typename T, typename Predicate=simple_compare<T> >
bool compare(T a, T b, Predicate pred) {
return pred(a, b);
}
可以使用C ++中的模板元編程來完成此操作,而不要使用帶有重載()運算符的結構嗎?
您不需要花哨的模板元編程內容。 只需創建兩個版本的模板函數。 沒有自定義謂詞的將只執行默認謂詞。
以下內容應能起作用:
auto default_pred = [](const auto a, const auto b) {return a > b;};
auto custom_pred = [](const auto a, const auto b) {return a < b;};
template<typename T, typename Fn >
bool compare2(T a, T b, Fn pred) {
return pred(a, b);
}
template<typename T >
bool compare2(T a, T b) {
return default_pred (a, b);
}
int main(){
cout<<compare2(2, 4)<<endl;
cout<<compare2(10.2d, 4.5d, custom_pred)<<endl;
return 0;
}
這里不需要模板元編程。 您可以簡單地使用重載(如Davide Spataro的答案所示)來提供不帶謂詞的版本,而僅使用默認謂詞調用完整版本。 或者,您可以僅對謂詞使用默認參數:
template <typename T, typename Predicate = simple_compare<T>>
bool compare(T a, T b, Predicate pred = {}) {
return pred(a, b);
}
如果您只想使用泛型仿函數來調用>運算符,則也可以僅使operator ()
成為模板而不是仿函數類型本身,並從調用中推導要比較的確切類型:
struct simple_compare {
template <typename A, typename B>
bool operator()(A const& a, B const& b) const {
return a > b;
}
};
template <typename T, typename Predicate = simple_compare>
bool compare(T a, T b, Predicate pred = {}) {
return pred(a, b);
}
而且,標准庫已經提供了用於調用各種運算符的標准函子。 因此,在示例中,您可以只使用std::greater<T>
或std::greater<void>
來代替自己滾動。 此外,我認為並沒有必要要求您的參數是可復制的並且具有相同類型:
template <typename A, typename B, typename Predicate = std::greater<void>>
bool compare(A const& a, B const& b, Predicate pred = {}) {
return pred(a, b);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.