深入解析:std::conditional_t一个用法
例子摘自:
《mastering-the-c17-stl-make-full-use-of-the-standard-library-components-in-c17.pdf》
struct list_node { int data; list_node *next;}; templatestruct list_of_ints_iterator { friend class list_of_ints; friend class list_of_ints_iterator; //Const为true的时候,编译成const list_node*,为false的时候,为list_node* using node_pointer = std::conditional_t; using reference = std::conditional_t; node_pointer ptr_; explicit list_of_ints_iterator(node_pointer p) : ptr_(p) {} public: reference operator*() const { return ptr_->data; } auto& operator++() { ptr_ = ptr_->next; return *this; } auto operator++(int) { auto result = *this; ++*this; return result; } // Support comparison between iterator and const_iterator types template bool operator==(const list_of_ints_iterator& rhs) const { return ptr_ == rhs.ptr_; } template bool operator!=(const list_of_ints_iterator& rhs) const { return ptr_ != rhs.ptr_; } // Support implicit conversion of iterator to const_iterator // (but not vice versa) operator list_of_ints_iterator() const { return list_of_ints_iterator{ptr_}; }}; struct list_of_ints { list_of_ints(list_node* phead, list_node* ptail) { head_ = phead; tail_ = ptail; } list_node *head_ = nullptr; list_node *tail_ = nullptr; // ...public: //Iterators and Ranges using const_iterator = list_of_ints_iterator; using iterator = list_of_ints_iterator; iterator begin() { return iterator{ head_ }; } iterator end() { return iterator{ nullptr }; } const_iterator begin() const { return const_iterator{ head_ }; } const_iterator end() const { return const_iterator{ nullptr }; }}; templatestruct TypePrint; int main(int, char**) { list_node node5{ 5, NULL }; list_node node4{ 4, &node5 }; list_node node3{ 3, &node4 }; list_node node2{ 2, &node3 }; list_node node1{ 1, &node2 }; list_of_ints list{ &node1, &node5 }; for (list_of_ints_iterator it=list.begin(); it!=list.end();++it) { //编译时会给出提示信息,打印it的类型。是list_of_ints_iterator //TypePrint x; std::cout x; std::cout << it << std::endl; } return 0; }