#include #include #include #include struct A { A(int val = 99) : _val(val) {} int _val; friend std::ostream& operator << (std::ostream& os, const A& a) { os << a._val; return os; } }; typedef std::vector< A > vect_t; template < typename Range > void print_range_clvalref(const Range& r, const std::string& tag) { std::cout << "[c&] " << tag << ":"; for (auto e : r) { std::cout << " " << e; } std::cout << std::endl; } template < typename Range > void print_range_lvalref(Range& r, const std::string& tag) { std::cout << "[&] " << tag << ":"; for (auto e : r) { std::cout << " " << e; } std::cout << std::endl; } template < typename Range > void print_range_crvalref(const Range&& r, const std::string& tag) { std::cout << "[c&&] " << tag << ":"; for (auto e : r) { std::cout << " " << e; } std::cout << std::endl; } template < typename Range > void print_range_rvalref(Range&& r, const std::string& tag) { std::cout << "[&&] " << tag << ":"; for (auto e : r) { std::cout << " " << e; } std::cout << std::endl; } int main() { vect_t v0(1, 12); vect_t v1(1, 34); std::cout << "join(v0, v1):"; for (auto a : boost::join(v0, v1)) { std::cout << " " << a; } std::cout << std::endl; std::cout << "join(v0, vect_t(1, 34)):"; for (auto a : boost::join(v0, vect_t(1, 34))) { std::cout << " " << a; } std::cout << std::endl; print_range_clvalref(boost::join(v0, v1), std::string("boost::join(v0, v1)")); print_range_clvalref(boost::join(v0, vect_t(1, 34)), std::string("boost::join(v0, vect_t(1, 34))")); //print_range_lvalref(boost::join(v0, v1), std::string("boost::join(v0, v1)")); //print_range_lvalref(boost::join(v0, vect_t(1, 34)), std::string("boost::join(v0, vect_t(1, 34))")); print_range_crvalref(boost::join(v0, v1), std::string("boost::join(v0, v1)")); print_range_crvalref(boost::join(v0, vect_t(1, 34)), std::string("boost::join(v0, vect_t(1, 34))")); print_range_rvalref(boost::join(v0, v1), std::string("boost::join(v0, v1)")); print_range_rvalref(boost::join(v0, vect_t(1, 34)), std::string("boost::join(v0, vect_t(1, 34))")); auto rg0 = boost::join(v0, v1); auto rg1 = boost::join(v0, vect_t(1, 34)); print_range_clvalref(rg0, "rg0"); print_range_clvalref(rg1, "rg1"); print_range_lvalref(rg0, "rg0"); print_range_lvalref(rg1, "rg1"); //print_range_crvalref(rg0, "rg0"); //print_range_crvalref(rg1, "rg1"); print_range_rvalref(rg0, "rg0"); print_range_rvalref(rg1, "rg1"); print_range_crvalref(std::move(rg0), "std::move(rg0)"); print_range_crvalref(std::move(rg1), "std::move(rg1)"); print_range_rvalref(std::move(rg0), "std::move(rg0)"); print_range_rvalref(std::move(rg1), "std::move(rg1)"); }