Container that holds objects of various types, and can be searched for an object convertible to a given type
You said you implemented


  a container that can hold objects of various types, and look
  up an object convertible to a given type


This idea can be simplified and generalized: we want to


  look up an object convertible to a given a type in a sequence of variants


We can focus on the get function and strip everything else.  The container does not have to be a std::vector&lt;std::variant&gt; &mdash; we can use iterators:

template &lt;typename T, typename ForIt&gt;
T get_convertible(ForIt first, ForIt last);


In the code, you want to find an element that is convertible to T, and throw an exception if such an element is not found.  You used std::optional to conditionally return the visited element.  This overhead can be eliminated:

template &lt;typename T, typename ForIt&gt;
T get_convertible(ForIt first, ForIt last)
{
    auto it = std::find_if(first, last, [](const auto&amp; variant) {
        return std::visit([](const auto&amp; value) {
            using U = std::decay_t&lt;decltype(value)&gt;;
            return std::is_convertible_v&lt;U, T&gt;;
        }, variant);
    });

    if (it == last) {
        throw std::runtime_error{"..."};
    } else {
        return std::visit([](const auto&amp; value) -&gt; T {
            using U = std::decay_t&lt;decltype(value)&gt;;
            if constexpr (std::is_convertible_v&lt;U, T&gt;)
                return value;
        }, *it);
    }
}


(live demo, includes code to disable return warning)