我想使用SFINAE原則來檢查實體化的模板是否是一個隨機訪問迭代器。為此,我使用了std::enable_if,但編譯器拋出了一個錯誤:
無法與之前的'type-name'宣告指定器結合
。
我怎樣才能解決這個問題?我真的需要幫助來解決這個問題。
template< class RandomAccessIterator, class Compare>
typename std::enable_if<std::is_same<std::random_access_iterator_tag, RandomAccessIterator>:value>
void quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare){
排序(first, last, 0, last - first - 1, compare) 。
}
uj5u.com熱心網友回復:
我看到的兩個問題:
你在寫std::enable_if<>而不是std::enable_if<>:type,這可能不是你想做的。
(錯誤的原因)你有兩個回傳型別。std::enable_if<>和void。你只能有一個回傳型別。
std::enable_if有第二個可選的型別引數,是std::enable_if<>:type的型別。這被默認設定為void,所以你的回傳型別已經是void,來自std::enable_if<>:type。然而,由于你把enable_if放在回傳型別中,我建議你明確指定回傳型別為void。
因此,解決你的問題的方法應該是這樣的:
template < class RandomAccessIterator, class Compare>
typename std::enable_if<
std::is_same<std::random_access_iterator_tag, RandomAccessIterator>:value。
void
>::type quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare) {
排序(first, last, 0, last - first - 1, compare) 。
}
另外,你可以在一個模板引數中使用std::enable_if:
template <
class RandomAccessIterator。
class Compare,
typename std::enable_if<
std::is_same<std::random_access_iterator_tag, RandomAccessIterator>:value。
std::nullptr_t
>:type = nullptrvoid quick_sort(RandomAccessIterator first, RandomAccessIterator last, Compare compare) {
排序(first, last, 0, last - first - 1, compare)。
}
uj5u.com熱心網友回復:
除了在這個答案中提到的技術問題外,你的方法根本就不能作業。
std::is_same<std::random_access_iterator_tag, RandomAccessIterator>:value將永遠不會評估為真,因為迭代器不是迭代器標簽。你需要通過std::iterator_traits使用標簽調度,而不是SFINAE,以確定傳入的迭代器是否是隨機訪問的。
請看 cppreference 上的例子。https://en.cppreference.com/w/cpp/iterator/iterator_tags
嘗試這樣做:
template<class Iter, class Compare>
void quick_sort_impl(Iter first, Iter last, Compare compare, std::random_access_iterator_tag) {
排序(first, last, 0, last - first - 1, compare)。
}
template<class Iter, class Compare>
void quick_sort(Iter first, Iter last, Compare compare) {
quick_sort_impl(first, last, compare, typename std::iterator_traits<Iter>::iterator_category() )。)
}
這樣,如果你試圖用非隨機訪問的迭代器呼叫quick_sort(),你將得到一個編譯器錯誤,原因是缺少針對非隨機迭代器標簽的quick_sort_impl()多載。如果你想為其他型別的迭代器實作排序,只需根據需要為其他型別的迭代器標簽多載quick_sort_impl()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/329612.html
標籤:
