std::tuple_element<std::pair>
來自 cppreference.com
在標頭檔案 <utility> 中定義 |
||
template< std::size_t I, class T1, class T2 > struct tuple_element<I, std::pair<T1, T2>>; |
(C++11 起) | |
對 pair 的 std::tuple_element 偏特化提供了在編譯時以類似 tuple 的語法訪問 pair 元素型別的功能。如果 I >= 2
,程式將是非良構的。
目錄 |
[編輯] 成員型別
成員型別 | 定義 |
型別
|
如果 I == 0 則為 T1 如果 I == 1 則為 T2 |
[編輯] 可能實現
template<std::size_t I, typename T> struct tuple_element; template<std::size_t I, typename T1, typename T2> struct tuple_element<I, std::pair<T1, T2>> { static_assert(I < 2, "std::pair has only 2 elements!"); }; template<typename T1, typename T2> struct tuple_element<0, std::pair<T1, T2>> { using type = T1; }; template<typename T1, typename T2> struct tuple_element<1, std::pair<T1, T2>> { using type = T2; }; |
[編輯] 示例
執行此程式碼
#include <iostream> #include <string> #include <tuple> namespace detail { template<std::size_t> struct index_tag { constexpr explicit index_tag() = default; }; template<class T, class U> constexpr T get_val_dispatch(std::pair<T, U> const& pair, index_tag<0>) { return pair.first; } template<class T, class U> constexpr U get_val_dispatch(std::pair<T, U> const& pair, index_tag<1>) { return pair.second; } } // namespace detail template<std::size_t N, class T, class U> auto constexpr get_val(std::pair<T, U> const& pair) -> typename std::tuple_element<N, std::pair<T, U>>::type { return detail::get_val_dispatch(pair, detail::index_tag<N>{}); } int main() { auto var = std::make_pair(1, std::string{"one"}); std::cout << get_val<0>(var) << " = " << get_val<1>(var); }
輸出
1 = one
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 2974 | C++11 | 越界索引指向未定義的原始模板 | 導致非良構(硬錯誤) |
[編輯] 參閱
結構化繫結 (C++17) | 將指定名稱繫結到初始化器的子物件或元組元素 |
獲取指定元素的型別 (類模板特化) | |
獲得 array 元素的型別(類模板特化) | |
獲取 std::ranges::subrange 的迭代器或哨兵的型別 (類模板特化) | |
(C++11) |
獲取 pair 的大小(類模板特化) |