#include <iostream>
 
template <typename T1, typename T2>
struct gattai2{
    T1 a;
    T2 b;
    decltype(b(a())) operator ()() { return b(a()); }
};
 
template <typename T>
struct gattai1{
    T a;
    decltype(a()) operator ()() { return a(); }
 
    template <typename T2>
    friend gattai2<T, T2> operator +(const gattai1<T> &g, const T2 &b){
        return {g.a, b};
    }
};
 
struct gattai{
    template <typename T>
    friend gattai1<T> operator +(const gattai &g, const T &a){
            return {a};
    }
};
 
int main(){
    auto atama = [](){ return 1; };
    auto mune = [](int i){ return "tekitou"; };
    auto robo = gattai() + atama + mune;
    std::cout << robo() << std::endl;
}