/* * subtuple: allow matlab-like taking of only the first n return values, like * * std::tuple f(); * A a; * B b; * tiex(a, b) = f(); * * Evan Herbst * 9 / 2 / 09 */ #ifndef EX_SUBTUPLE_H #define EX_SUBTUPLE_H #include template class subtuple; template class subtuple { public: subtuple(T1& a1) : data(a1) {} template subtuple(const std::tuple& t) { std::get<0>(data) = std::get<0>(t); } template subtuple(std::tuple&& t) { std::get<0>(data) = std::move(std::get<0>(t)); } template void operator = (const std::tuple& t) { std::get<0>(data) = std::get<0>(t); } template void operator = (std::tuple&& t) { std::get<0>(data) = std::move(std::get<0>(t)); } private: std::tuple data; }; template class subtuple { public: subtuple(T1& a1, T2& a2) : data(a1, a2) {} template subtuple(const std::tuple& t) { std::get<0>(data) = std::get<0>(t); std::get<1>(data) = std::get<1>(t); } template subtuple(std::tuple&& t) { std::get<0>(data) = std::move(std::get<0>(t)); std::get<1>(data) = std::move(std::get<1>(t)); } template void operator = (const std::tuple& t) { std::get<0>(data) = std::get<0>(t); std::get<1>(data) = std::get<1>(t); } template void operator = (std::tuple&& t) { std::get<0>(data) = std::move(std::get<0>(t)); std::get<1>(data) = std::move(std::get<1>(t)); } private: std::tuple data; }; template subtuple tiex(Ts&... args) { return subtuple(args...); } #endif //EX_SUBTUPLE_H