#include <cstddef>
#include <iostream>
#include <memory>
#include <stdexcept>
#include <string>
#include <tuple>
#include <type_traits>
#include <utility>
#include <variant>
// created with ChatGPT
namespace detail { template <class Tuple, std::size_t... Is> using tuple_ptr_variant_t = std::variant<std::add_pointer_t<std::tuple_element_t<Is, std::remove_reference_t<Tuple>>>...>; template <class Tuple, std::size_t... Is> constexpr auto get_index_impl(Tuple& tup, std::size_t index, std::index_sequence<Is...>) -> tuple_ptr_variant_t<Tuple, Is...> { using result_t = tuple_ptr_variant_t<Tuple, Is...>; if (index >= sizeof...(Is)) throw std::out_of_range("get_index: index out of range"); result_t result{}; ((index == Is ? (static_cast<void>(result.template emplace<Is>(std::addressof(std::get<Is>(tup)))), true) : false) || ...); return result; } } template <class Tuple> constexpr auto get_index(Tuple& tup, std::size_t index) { using tuple_t = std::remove_reference_t<Tuple>; return detail::get_index_impl(tup, index, std::make_index_sequence<std::tuple_size_v<tuple_t>>{}); } template <class Tuple> constexpr auto get_index(Tuple&&, std::size_t) = delete;
void process(std::variant<int*, double*, std::string*> v) {
if (std::holds_alternative<double*>(v))
*std::get<double*>(v) += 10.;
std::visit([](auto* elem) {
std::cout << "print any: " << *elem << '\n';
}, v);
}
int main() {
std::tuple<int, double, std::string> t{100, 9.81, "abc"};
std::size_t idx = 1;
process(get_index(t, idx));
process(get_index(t, 2));
}