假設我有一些模板函式,它回傳傳遞給它的某個可迭代物件的中值。
就像是:
template<typename T>
decltype(auto) find_median_sorted(T begin)
{
// some code here
}
現在我想確保我被限制T為總是可迭代的。我正在嘗試學習如何concepts在 C 中使用,那么我可以concept在這里使用某種方法來確保它T是可迭代的嗎?
我確定還有其他方法可以檢查它是否可迭代,但這是錯誤的用例concepts嗎?我也在這里遇到了與元素可迭代相關的這篇文章,但我不確定這如何適用于我的情況。
uj5u.com熱心網友回復:
我正在嘗試學習如何在 C 中使用概念,那么我可以
concept在這里使用某種方法來確保 T 是可迭代的嗎?
您可以std::ranges::range從<ranges>這里的標題中獲得標準概念。有了它,您的功能將如下所示:
#include <ranges> // std::ranges::range
template<std::ranges::range T>
decltype(auto) find_median_sorted(T const& container) {
// some code here
}
要將范圍限制為僅用于隨機訪問可迭代范圍,您可以std::ranges::random_access_range再次使用<ranges>header
#include <ranges> // std::ranges::random_access_range
template<std::ranges::random_access_range T>
decltype(auto) find_median_sorted(T const& container) {
// some code here
}
或通過迭代器概念std::random_access_iterator
如下:
#include <iterator> // std::random_access_iterator
template<typename T>
decltype(auto) find_median_sorted(T const& container)
requires std::random_access_iterator<std::ranges::iterator_t<T>>
{
// some code here
}
uj5u.com熱心網友回復:
編輯:問題中的原始代碼看起來更像迭代器,因此為什么是基于迭代器的答案。就目前而言,基于范圍的答案更適合 OP 的要求。
“老派”迭代器與其現代解釋之間的一個重要區別是哨兵(又名結束迭代器)不一定必須與開始的型別相同。
所以你應該使用 2 個單獨的約束。一個用于迭代器本身,另一個用于哨兵,使用std::sentinel_for:
至于迭代器本身,您將希望使用最寬松的迭代器概念,它允許您執行您想做的作業。std::input_iterator如果可能的話最好。
應用約束只是typename在模板中用適當的概念替換:
#include <iterator>
template<std::input_iterator I, std::sentinel_for<I> S>
auto find_median_sorted(I begin, S end){
// some code here
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346195.html
上一篇:為什么Eigen不需要模板關鍵字來使用Matrix的模板函式呼叫?
下一篇:C 我應該使用轉發參考嗎?
