#include <iostream>
#include <tuple>

template <typename NewElem, typename... TupleElem>
std::tuple<TupleElem..., NewElem> tuple_append(const std::tuple<TupleElem...> &tup, const NewElem &el) {
    return std::tuple_cat(tup, std::make_tuple(el));
}

int main()
{
    auto t = std::make_tuple(1, 2.0, 'a');
    auto t2 = tuple_append(t, false);
    std::cout << std::boolalpha;
    std::cout << std::get<0>(t2) << '\n';
    std::cout << std::get<1>(t2) << '\n';
    std::cout << std::get<2>(t2) << '\n';
    std::cout << std::get<3>(t2) << '\n';
}