簡體   English   中英

使用模板元編程C ++比較2個值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM