1
A
回答
1
完整吹塑容器的測試很困難且不明確。就個人而言,我認爲容器當且僅當它擁有它的直接內容,但這可能不符合其他人對該術語的使用。
對迭代性的測試既不困難也不含糊,通常是在函數參數中採用對象時要測試的內容。有些迭代的東西不是非常容易的(例如C++ 1y或C++ 1z的string_view
)。
我認爲,在C++ 11,一個實例下的X型的是當且僅當可迭代:
for(auto&& a : c) {}
是公形成。爲上述選擇的措辭意味着您可以使用begin
和end
自由函數重載擴展任何類型以使其成爲可迭代的。
一個體面的逼近,如果將上面的工作將是檢驗如果在參數依賴啓用查找背景下,std::begin
和std::end
回報的東西,有一個有效的std::iterator_traits<>
。
作爲一個速寫,我得到的是這樣的:
template<typename T, typename=void>
struct is_iterable : std::false_type {};
namespace aux {
using std::begin;
// note: no implementation
template<typename C>
auto adl_begin(C&& c)->decltype(begin(std::forward<C>(c)));
using std::end;
// note: no implementation
template<typename C>
auto adl_end(C&& c)->decltype(end(std::forward<C>(c)));
}
template<typename T>
struct is_iterable<T,
typename std::enable_if<
std::is_same<
typename std::iterator_traits< typename std::decay<decltype(aux::adl_begin(std::declval<T>()))>::type >::iterator_category,
typename std::iterator_traits< typename std::decay<decltype(aux::adl_end(std::declval<T>()))>::type >::iterator_category
>::value
>::type
> : std::true_type {};
容器,同時,很少是因爲統一。他們最基本的「常見」過程,如添加元素,在簽名和語義方面各不相同。 erase(iterator)
和::allocator_type
是容器狀結構的兩個最常見的特徵,但std::array<T,N>
和T[N]
可以說是容器並且沒有屬性。
簡而言之,超越它們的可迭代性的共同屬性,容器差別太大了,因爲那裏有非常有用的特性類。相反,你應該計算出你正在尋找的容器的屬性(刪除元素的能力,插入元素的能力,隨機訪問),然後測試它們。
1
的另一種方法是使用boost::spirit::traits::is_container<>
mpl::true_
返回如果T
具有以下嵌入類型定義:value_type
,iterator
,size_type
,和reference
。否則,它將返回mpl::false_
。
適用於C++ 03及以上版本。
相關問題
- 1. 有沒有辦法推導一個函數指針模板參數的值?
- 2. 有沒有辦法部分匹配variadic模板參數包?
- 3. 有沒有辦法從變量設置模板參數?
- 4. 沒有模板參數的模板類的容器
- 5. 有沒有辦法確保你的CSS是跨瀏覽器的?
- 6. 有沒有辦法做模板聲明
- 7. 有沒有辦法用一個「模式」
- 8. 有沒有辦法用一行來初始化一個容器?
- 9. Django - 有沒有辦法在模板中創建一個變量?
- 10. 有沒有辦法在一個getter中返回三個容器?
- 11. 有沒有辦法使用position()在兩個模板之間保持行數?
- 12. 有沒有辦法將模板化函數簽名作爲模板模板參數
- 13. 有沒有辦法讓一個linux容器「休眠」
- 14. 有沒有辦法忽略Handlebars模板中的Handlebars模板?
- 15. 有沒有辦法在一個數組
- 16. 有沒有辦法在一個數組
- 17. 可變參數模板 - 是有辦法避免重複
- 18. 有沒有辦法處理模板類中可變數量的參數?
- 19. 有沒有辦法「強制」MatrixBase :: eval發生在模板函數參數上?
- 20. PHP。有沒有辦法要求函數參數是一個數組?
- 21. 有沒有辦法確保一個數組變量(unsigned int *)將在內存中?
- 22. 有沒有辦法來覆蓋編譯器::模板中定義()
- 23. 有沒有辦法一次運行多個iOS模擬器?
- 24. 確保widget有一個容器?
- 25. 有沒有辦法保存HSQLDB數據?
- 26. 有沒有辦法在PHP PDO中設置一個參數?
- 27. 有沒有辦法將一個類型參數約束爲SqlDbType?
- 28. 確保模板參數是一個枚舉類
- 29. 有沒有辦法省略掉參數?
- 30. Ant macrodef:有沒有辦法獲取元素參數的內容?
任何容器或標準庫容器? – Borgleader
爲什麼?整個觀點是你不應該在意。只要正確的功能可用,讓實例化工作。否則,你就會走上一條黑暗而危險的道路:「只有我才能選擇哪種類型是'正確的'」 –
你稱之爲集裝箱?容器是否擁有其內容? – Yakk