1 /* 2 Copyright 2019 Glen Joseph Fernandes 3 (glenjofe@gmail.com) 4 5 Distributed under the Boost Software License, Version 1.0. 6 (http://www.boost.org/LICENSE_1_0.txt) 7 */ 8 #include <boost/config.hpp> 9 #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && \ 10 !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) 11 #include <boost/functional/factory.hpp> 12 #include <boost/core/lightweight_test.hpp> 13 #include <boost/smart_ptr/scoped_ptr.hpp> 14 15 class arg { 16 public: arg(int n)17 explicit arg(int n) 18 : value_(n) { } 19 arg(arg && a)20 arg(arg&& a) 21 : value_(a.value_) { } 22 get() const23 int get() const { 24 return value_; 25 } 26 27 private: 28 int value_; 29 }; 30 31 class sum { 32 public: sum(arg && a1,arg && a2)33 explicit sum(arg&& a1, arg&& a2) 34 : value_(a1.get() + a2.get()) { } 35 get() const36 int get() const { 37 return value_; 38 } 39 40 private: 41 int value_; 42 }; 43 main()44int main() 45 { 46 boost::scoped_ptr<sum> s(boost::factory<sum*>()(arg(1), arg(2))); 47 BOOST_TEST(s->get() == 3); 48 return boost::report_errors(); 49 } 50 #else main()51int main() 52 { 53 return 0; 54 } 55 #endif 56