1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <cstdlib> #include <utility> #include <memory> #include <iostream> template< typename Ret, typename Last > Ret random_picker_impl( size_t i, Last&& last ) { return std::forward<Last>(last); } template< typename Ret, typename First, typename Second, typename ... Rest > Ret random_picker_impl( size_t i, First&& first, Second&& second, Rest&&... rest ) { if( i == 0 ) { return std::forward<First>(first); } else { return random_picker_impl<Ret>( i-1, std::forward<Second>(second), std::forward<Rest>(rest)... ); } } template< typename First, typename ... Rest > First random_picker( First&& first, Rest&&... rest ) { size_t index = (sizeof...(rest) + 1) * (std::rand() / double(RAND_MAX)); return random_picker_impl<First>( index, std::forward<First>(first), std::forward<Rest>(rest)... ); } int main() { for( int i=0; i<20; ++i ) { std::unique_ptr<int> a(new int(1)); std::unique_ptr<int> b(new int(1)); std::unique_ptr<int> c(new int(1)); auto i = random_picker( a, b, c ); std::cout << "chose: " << *i.get() << '\n'; } } |
I2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDx1dGlsaXR5PgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUmV0LCB0eXBlbmFtZSBMYXN0ID4KUmV0IHJhbmRvbV9waWNrZXJfaW1wbCggc2l6ZV90IGksIExhc3QmJiBsYXN0ICkKewogICByZXR1cm4gc3RkOjpmb3J3YXJkPExhc3Q+KGxhc3QpOwp9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgUmV0LCB0eXBlbmFtZSBGaXJzdCwgdHlwZW5hbWUgU2Vjb25kLCB0eXBlbmFtZSAuLi4gUmVzdCA+ClJldCByYW5kb21fcGlja2VyX2ltcGwoIHNpemVfdCBpLCBGaXJzdCYmIGZpcnN0LCBTZWNvbmQmJiBzZWNvbmQsIFJlc3QmJi4uLiByZXN0ICkKewogICBpZiggaSA9PSAwICkKICAgewogICAgICByZXR1cm4gc3RkOjpmb3J3YXJkPEZpcnN0PihmaXJzdCk7CiAgIH0KICAgZWxzZQogICB7CiAgICAgIHJldHVybiByYW5kb21fcGlja2VyX2ltcGw8UmV0PiggaS0xLCBzdGQ6OmZvcndhcmQ8U2Vjb25kPihzZWNvbmQpLCBzdGQ6OmZvcndhcmQ8UmVzdD4ocmVzdCkuLi4gKTsKICAgfQp9Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgRmlyc3QsIHR5cGVuYW1lIC4uLiBSZXN0ID4KRmlyc3QgcmFuZG9tX3BpY2tlciggRmlyc3QmJiBmaXJzdCwgUmVzdCYmLi4uIHJlc3QgKQp7CiAgIHNpemVfdCBpbmRleCA9IChzaXplb2YuLi4ocmVzdCkgKyAxKSAqIChzdGQ6OnJhbmQoKSAvIGRvdWJsZShSQU5EX01BWCkpOwogICByZXR1cm4gcmFuZG9tX3BpY2tlcl9pbXBsPEZpcnN0PiggaW5kZXgsIHN0ZDo6Zm9yd2FyZDxGaXJzdD4oZmlyc3QpLCBzdGQ6OmZvcndhcmQ8UmVzdD4ocmVzdCkuLi4gKTsKfQoKaW50IG1haW4oKQp7CiAgIGZvciggaW50IGk9MDsgaTwyMDsgKytpICkKICAgewogICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiBhKG5ldyBpbnQoMSkpOwogICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiBiKG5ldyBpbnQoMSkpOwogICAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50PiBjKG5ldyBpbnQoMSkpOwogICAgICBhdXRvIGkgPSByYW5kb21fcGlja2VyKCBhLCBiLCBjICk7CiAgICAgIHN0ZDo6Y291dCA8PCAiY2hvc2U6ICIgPDwgKmkuZ2V0KCkgPDwgJ1xuJzsKICAgfQp9
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unique_ptr.h: In function 'int main()': /usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/unique_ptr.h:207:7: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = std::default_delete<int>, std::unique_ptr<_Tp, _Tp_Deleter> = std::unique_ptr<int>]' prog.cpp:39:39: error: used here
-
result: Compilation error (maybe you wish to see an example for C++11)


