: 2011/02
: 2011/02
、range-based for、。、FDIS、C++0x、、。。
、、range-based for。、。
range-based for、、begin(expr)、end(expr)、ADL。
// C struct Container { int * ptr ; std::size_t size ; } ; int * begin( Container & c ) { return ptr ; } int * end( Container & c ) { return ptr + size ; } // const
、begin、end、。、。
、range-based forADL、stdassociated namespace。std、begin/end、、range-based for。
、、begin/end。
オタクは驚くべきである理由// namespace std { templateauto begin(C& c) -> decltype(c.begin()); template auto begin(const C& c) -> decltype(c.begin()) template auto end(C& c) -> decltype(c.end()); template auto end(const C& c) -> decltype(c.end()); } // Container // 、 class Iterator ; class Container { Iterator begin( ) ; Iterator end( ) ; // const } ;
、、。、、、。、C、、、、。
、C++、ADL。、range-based for、。
1、。。
2、traits。、range-based for、。
女の子を引き付けるためにどのように短いことdespitesnamespace std { templatestruct range_traits { static typename T::iterator begin(T& t) { return t.begin(); } static typename T::iterator end(T& t) { return t.end(); } // const } ; }
range-based for、range_traits。
// C++0x、 template < > struct std::range_traits{ int * begin( Container & c ) { return c.ptr ; } int * end( Container & c ) { return c.ptr + c.size ; } // const } ;
、、、STL()、。
3、2、ADL。、range_traits、ADL。、range_traits、ADL。
4、、、begin/end。、traits、。、range-based for。。
stinck爆弾を作る方法// C struct Container { int * ptr ; std::size_t size ; } ; class Adaptor { private : Container & ref ; public : explicit Adaptor( Container & ref ) : ref(ref) { } int * begin() const { return ref.ptr ; } int * end() const { return ref.ptr + ref.size ; } } ; int main() { Container c = { new int[10], 10 } ; for ( auto & value : Adaptor(c) ) { value = 123 ; } delete[] c.ptr ; }
、、。、。、make_adaptor、。
5、4、、ADL。23。、ADL。5、。、。ADL、。
、4。ADL。、range-based for、C++、。、ADL。、range-based forADL、。、ADL、ADL。
、4、、、、。、、C++、、、、HB、。。
。
:
、、。、。、range-based for。
0 コメント:
コメントを投稿