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;
};template<bool Const>
struct list_of_ints_iterator {friend class list_of_ints;friend class list_of_ints_iterator<!Const>;//Const为true的时候,编译成const list_node*,为false的时候,为list_node*using node_pointer = std::conditional_t<Const, const list_node*,list_node*>;using reference = std::conditional_t<Const, const int&, int&>;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 typestemplate<bool R>bool operator==(const list_of_ints_iterator<R>& rhs) const{return ptr_ == rhs.ptr_;}template<bool R>bool operator!=(const list_of_ints_iterator<R>& rhs) const{return ptr_ != rhs.ptr_;}// Support implicit conversion of iterator to const_iterator// (but not vice versa)operator list_of_ints_iterator<true>() const{return list_of_ints_iterator<true>{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 Rangesusing const_iterator = list_of_ints_iterator<true>;using iterator = list_of_ints_iterator<false>;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 }; }
};template<typename type>
struct 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<false> it=list.begin(); it!=list.end();++it){//编译时会给出提示信息,打印it的类型。是list_of_ints_iterator<false>//TypePrint<decltype(it)> x; std::cout << *it << std::endl;}for (auto it : list){//编译时会给出提示信息,打印it的类型。是int//TypePrint<decltype(it)> x; std::cout << it << std::endl;}return 0;}