#include <iostream>
template<class seq,class list>
struct mylambda
{
    seq& s;
    size_t I =0;
    constexpr mylambda(seq& s):s(s){}
    template<class T>
    constexpr void operator()(T&& tuple_element)
    {
        tuple_element= {boost::fusion::at_c<I>(s),boost::mp11::mp_at_c<list,I>()};
        I++;
    }
};
template<class TaggedType, class Tag1>
using TagView = tag_view<TaggedType,Tag1>;

template<class seq, typename ...list>
constexpr auto create_tag_views( seq& s,  list&&... )
{
    // boost::mp11::mp_list<tag_view<n1,n1>,tag_view<n2,n2>>
    using R = typename boost::mp11::mp_product<TagView,mp_mpl_sequence<seq>,boost::mp11::mp_list<list...>>;
    // std::tuple<tag_view<n1,n1>,tag_view<n2,n2>>
    using Tuple = typename boost::mp11::mp_rename<R,std::tuple>;
    constexpr Tuple tuple;
    using taglist = boost::mp11::mp_list<list...>;
    //constexpr size_t I = 0;
    //constexpr size_t size = boost::mp11::mp_size<taglist>::value;
    boost::mp11::tuple_for_each(tuple, mylambda<seq,taglist>{s}
                                /*[&]( auto& tuple_element ){
        tuple_element= {boost::fusion::at_c<I>(s),boost::mp11::mp_at_c<taglist,I>()};
        //I++;//no const expr lambda :/
    }//*/
    );
    return tuple;
}

using namespace std;

int main() {
	// your code goes here
	return 0;
}