Как совместить вывод типов и пользовательские преобразования при передаче объекта в шаблонную функцию
Извиняюсь за путанное название. Не знаю как еще это назвать.
Есть некая обёртка-ссылка
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
?