簡體   English   中英

如何聲明對標准算法的引用?

[英]How to declare a reference to std algorithm?

我正在嘗試添加對 std 算法的引用。 如何編輯我的代碼以使其正常工作?

double f(const std::vector<double> &arr, bool maxElem)
{
    auto me = maxElem ? std::max_element : std::min_element;
    //...
    x = me(arr.begin(), arr.end());
    //...
}

您的函數是模板函數,因此您必須指定模板參數。 在這種情況下,使用std::vector您需要將迭代器傳遞給它們:

此外,為了應對函數的不同潛在重載,我們應該它們強制轉換為我們需要的類型(感謝@ChristianHackl)

double f(const std::vector<double>& arr, bool maxElem)
{
    // deduce the iterator parameter types
    using Iterator = decltype(arr.begin());

    // select the overload type
    using Overload = Iterator(*)(Iterator, Iterator);

    auto me = maxElem
        ? static_cast<Overload>(std::max_element<Iterator>)
        : static_cast<Overload>(std::min_element<Iterator>);

    // need to dereference this because `me` returns an iterator
    return *me(arr.begin(), arr.end());
}

另請注意,我取消引用me()的返回值,因為它是一個迭代器(就像一個指針)。

當然,如果您的向量為空,則會取消對無效位置的引用,因此我建議進行檢查:

double f(const std::vector<double>& arr, bool maxElem)
{
    // Avoid Undefined Behavior
    if(arr.empty())
        throw std::runtime_error("empty vector not allowed");

    // deduce the parameter types
    using Iterator = decltype(arr.begin());

    // select the overload type
    using Overload = Iterator(*)(Iterator, Iterator);

    auto me = maxElem
        ? static_cast<Overload>(std::max_element<Iterator>)
        : static_cast<Overload>(std::min_element<Iterator>);

    // need to dereference this because `me` returns an iterator
    return *me(arr.begin(), arr.end());
}

像這樣:

if (maxElem)
   return std::max_element(arr.begin(), arr.end());
else
   return std::min_element(arr.begin(), arr.end());

可能會獲得對您嘗試使用的每個“算法”的模板專業化的引用,但由於需要指定模板參數,這將是混亂和冗長的,因此是錯誤的經濟。 它還可能帶來性能損失(破壞內聯性)。

首先, f的行為沒有任何意義; 盡量讓你的函數做好件事。 可以說,它們的底層語義不應該依賴於這樣的論點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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