我正在嘗試撰寫一個模板方法來處理 STL 容器中的專案。獲取容器的詳細資訊很容易(我使用 std::enable_if 子句允許僅在容器可以迭代時呼叫此模板方法(檢測到 begin() 方法。))我還需要知道資料容器持有的型別。這是有效的:
template <typename CONTAINER>
std::string doStuff(const CONTAINER & container) {
using CONTAINER_TYPE = typename CONTAINER::value_type;
}
if constexpr
如果我還可以確定容器中存放的東西的型別,我可以在這個方法中使用它來做某些事情。這是不起作用的代碼,但就像我正在嘗試的那樣:
template <typename CONTAINER, typename ITEM>
std::string doStuff(const CONTAINER<ITEM> & container) {
using CONTAINER_TYPE = typename CONTAINER::value_type;
using ITEM_TYPE = typename ITEM::value_type;
}
為什么我不能以這種方式呼叫該方法是完全有道理的,但是我可以做什么(在呼叫該方法或在該方法內使用元編程)來確定容器中專案的型別。我想這樣做,以便在編譯時知道它。
(我已經嘗試了 decltype 和 invoke_result 的幾種排列以及大量搜索,但還沒有什么效果。)我嘗試過例如:
using ITEM_TYPE = std::invoke_result<&CONTAINER::begin>::type;
當然,這會回傳一個需要取消參考的迭代器型別,但 '*' 在這里似乎沒有按預期作業。
uj5u.com熱心網友回復:
您可以使用模板模板引數:
template <template <class, class...> class CONTAINER, class ITEM, class... REST>
std::string doStuff(const CONTAINER<ITEM, REST...>& container) {
using CONTAINER_TYPE = ITEM; // or `typename CONTAINER<ITEM, REST...>::value_type`
// This requires SFINAE to not match `ITEM`s without `value_type`:
using ITEM_TYPE = typename ITEM::value_type;
//...
}
uj5u.com熱心網友回復:
您可以簡單地添加額外的typename
template <typename CONTAINER>
std::string doStuff(const CONTAINER& container){
using CONTAINER_TYPE = typename CONTAINER::value_type;
using ITEM_TYPE = typename CONTAINER_TYPE::value_type;
}
可能有一些 SFINAE(我將使用 C 20 方式)
template <typename CONTAINER>
std::string doStuff(const CONTAINER& container)
requires(
requires {
typename CONTAINER::value_type::value_type;
})
{
using CONTAINER_TYPE = typename CONTAINER::value_type;
using ITEM_TYPE = typename CONTAINER_TYPE::value_type;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496353.html
上一篇:為什么C 模板陣列長度推導需要像“f(T(&a)[N]”?
下一篇:陣列C 的除錯模板