#include<vector>
#include<iostream>
#include<utility>
namespace named_operator {
template<class D>struct make_operator{make_operator(){}};
template<class T, char, class O> struct half_apply { T&& lhs; };
template<class Lhs, class Op>
half_apply<Lhs, '+', Op> operator+( Lhs&& lhs, make_operator<Op> ) {
return {std::forward<Lhs>(lhs)};
}
template<class Lhs, class Op, class Rhs>
auto operator+( half_apply<Lhs, '+', Op>&& lhs, Rhs&& rhs )
-> decltype( named_invoke( std::forward<Lhs>(lhs.lhs), Op{}, std::forward<Rhs>(rhs) ) )
{
return named_invoke( std::forward<Lhs>(lhs.lhs), Op{}, std::forward<Rhs>(rhs) );
}
}
namespace ops {
struct concat_t:named_operator::make_operator<concat_t>{};
static const concat_t concat{};
template<class T, class A, class A2>
std::vector<T,A> named_invoke( std::vector<T,A> lhs, concat_t, std::vector<T,A2> const& rhs){
lhs.insert(lhs.end(), rhs.begin(), rhs.end());
return std::move(lhs);
}
}
using ops::concat;
int main(){
std::vector<int> a{1,2,3};
std::vector<int> b{7,8,9};
for( auto x: a +concat+ a +concat+ b )
std::cout <<x<<'\n';
}
I2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8dXRpbGl0eT4KCiAgIG5hbWVzcGFjZSBuYW1lZF9vcGVyYXRvciB7CiAgICAgIHRlbXBsYXRlPGNsYXNzIEQ+c3RydWN0IG1ha2Vfb3BlcmF0b3J7bWFrZV9vcGVyYXRvcigpe319OwoKICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2hhciwgY2xhc3MgTz4gc3RydWN0IGhhbGZfYXBwbHkgeyBUJiYgbGhzOyB9OwoKICAgICAgdGVtcGxhdGU8Y2xhc3MgTGhzLCBjbGFzcyBPcD4KICAgICAgaGFsZl9hcHBseTxMaHMsICcrJywgT3A+IG9wZXJhdG9yKyggTGhzJiYgbGhzLCBtYWtlX29wZXJhdG9yPE9wPiApIHsKICAgICAgICByZXR1cm4ge3N0ZDo6Zm9yd2FyZDxMaHM+KGxocyl9OwogICAgICB9CgogICAgICB0ZW1wbGF0ZTxjbGFzcyBMaHMsIGNsYXNzIE9wLCBjbGFzcyBSaHM+CiAgICAgIGF1dG8gb3BlcmF0b3IrKCBoYWxmX2FwcGx5PExocywgJysnLCBPcD4mJiBsaHMsIFJocyYmIHJocyApCiAgICAgIC0+IGRlY2x0eXBlKCBuYW1lZF9pbnZva2UoIHN0ZDo6Zm9yd2FyZDxMaHM+KGxocy5saHMpLCBPcHt9LCBzdGQ6OmZvcndhcmQ8UmhzPihyaHMpICkgKQogICAgICB7CiAgICAgICAgcmV0dXJuIG5hbWVkX2ludm9rZSggc3RkOjpmb3J3YXJkPExocz4obGhzLmxocyksIE9we30sIHN0ZDo6Zm9yd2FyZDxSaHM+KHJocykgKTsKICAgICAgfQogICAgfQoKICAgIG5hbWVzcGFjZSBvcHMgewogICAgICBzdHJ1Y3QgY29uY2F0X3Q6bmFtZWRfb3BlcmF0b3I6Om1ha2Vfb3BlcmF0b3I8Y29uY2F0X3Q+e307CiAgICAgIHN0YXRpYyBjb25zdCBjb25jYXRfdCBjb25jYXR7fTsKICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQSwgY2xhc3MgQTI+CiAgICAgIHN0ZDo6dmVjdG9yPFQsQT4gbmFtZWRfaW52b2tlKCBzdGQ6OnZlY3RvcjxULEE+IGxocywgY29uY2F0X3QsIHN0ZDo6dmVjdG9yPFQsQTI+IGNvbnN0JiByaHMpewogICAgICAgIGxocy5pbnNlcnQobGhzLmVuZCgpLCByaHMuYmVnaW4oKSwgcmhzLmVuZCgpKTsKICAgICAgICByZXR1cm4gc3RkOjptb3ZlKGxocyk7CiAgICAgIH0KICAgIH0KICAgIHVzaW5nIG9wczo6Y29uY2F0OwoKICAgIGludCBtYWluKCl7CiAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGF7MSwyLDN9OwogICAgICAgc3RkOjp2ZWN0b3I8aW50PiBiezcsOCw5fTsKCiAgICAgIGZvciggYXV0byB4OiBhICtjb25jYXQrIGEgK2NvbmNhdCsgYiApCiAgICAgICAgc3RkOjpjb3V0IDw8eDw8J1xuJzsKICAgIH0=