Как совместить вывод типов и пользовательские преобразования при передаче объекта в шаблонную функцию

Извиняюсь за путанное название. Не знаю как еще это назвать.

Есть некая обёртка-ссылка

template <typename T>
class my_wrapper {
private:
    T* _ptr;
public:
    my_wrapper(T& arg) : _ptr(std::addressof(arg)) {}
    operator T() { return *_ptr ; }
};

Нужно чтобы при передаче экземпляров этого класса в функцию, они воспринимались как исходный класс, а не как класс-обёртка.

При передаче в обычные функции, всё работает. Компилятор просто берёт подходящее пользовательское преобразование

void foo(int const&) {
    std::cout << "detected int\n";
}

int main() {
    int v1;
    my_wrapper<decltype(v1)> wrap_1(v1);
    foo(wrap_1); // ok

Но я хочу передавать их в шаблонную функции, где не только нужно сделать преобразование, но и вывод типов.

template<typename T>
void foo(std::vector<T> const&) {
    std::cout << "detected std::vector<T> [T = " << typeid(T).name() << "]\n";
}

int main() {
    std::vector<int> v3;
    my_wrapper<decltype(v3)> wrap_3(v3);
    foo(wrap_3); // fail

Вот ссылка, где я оставил свои потуги для посмотреть/покрутить https://godbolt.org/z/MM61EK9er

Это, скажем так, самый минимальный пример, который хотелось бы решить https://godbolt.org/z/orvTqe97x

Но есть одно НО! Я не могу менять целевые функции под свой врапер. Т.е. мне нужно решить проблему именно на стороне врапера. Чтобы он передавал себя как содержимое.

И еще у меня есть большое подозрение, что решить задачу так, как я её ставлю, нельзя в принципе. Правильно ли я подозреваю, что решать её нужно через добавление метода get(), как это сделано в стандартном std::reference_wrapper?


Ответы (0 шт):